|
|
|
|
@ -106,6 +106,7 @@ def google_address(address): |
|
|
|
|
response = {'address' : results[0].get('formatted_address'), |
|
|
|
|
'lat' : results[0]['geometry']['location']['lat'], |
|
|
|
|
'lng' : results[0]['geometry']['location']['lng']} |
|
|
|
|
#return response |
|
|
|
|
return json.dumps(response) |
|
|
|
|
else: |
|
|
|
|
return '' |
|
|
|
|
@ -113,11 +114,11 @@ def google_address(address): |
|
|
|
|
|
|
|
|
|
from djutils.decorators import async |
|
|
|
|
from djutils.queue.decorators import queue_command |
|
|
|
|
|
|
|
|
|
# place |
|
|
|
|
class ImportPlaceExpositionForm(ImportForm): |
|
|
|
|
model = PlaceExposition |
|
|
|
|
settings = place_exp_sett |
|
|
|
|
#@async |
|
|
|
|
|
|
|
|
|
def save_file(self): |
|
|
|
|
data = self.cleaned_data |
|
|
|
|
lang = data['language'] |
|
|
|
|
@ -125,86 +126,113 @@ class ImportPlaceExpositionForm(ImportForm): |
|
|
|
|
book = xlrd.open_workbook(file_contents=f.read()) |
|
|
|
|
sheet = book.sheet_by_index(0) |
|
|
|
|
row_list = [sheet.row_values(row_number) for row_number in range(sheet.nrows)] |
|
|
|
|
model = self.model |
|
|
|
|
|
|
|
|
|
labels = [label for label in row_list[0]] |
|
|
|
|
errors = [] |
|
|
|
|
|
|
|
|
|
for row_number, row in enumerate(row_list): |
|
|
|
|
if row_number == 0: |
|
|
|
|
continue |
|
|
|
|
if row[0] != '': |
|
|
|
|
# in first column id |
|
|
|
|
try: |
|
|
|
|
obj = self.model.objects.language(lang).get(id=int(row[0])) |
|
|
|
|
except ValueError: |
|
|
|
|
obj = self.model() |
|
|
|
|
obj.translate(lang) |
|
|
|
|
|
|
|
|
|
except self.model.DoesNotExist: |
|
|
|
|
obj = self.model(id= int(row[0])) |
|
|
|
|
obj.translate(lang) |
|
|
|
|
else: |
|
|
|
|
# if id blank - its a new event |
|
|
|
|
obj = model() |
|
|
|
|
obj.translate(lang) |
|
|
|
|
# ---------------- |
|
|
|
|
# go through all rows in file |
|
|
|
|
if row_number > 0: |
|
|
|
|
# first field is label |
|
|
|
|
if row[0] != '': |
|
|
|
|
# in first column ids |
|
|
|
|
|
|
|
|
|
methods = [] |
|
|
|
|
for col_number, cell in enumerate(row): |
|
|
|
|
# go through row cells |
|
|
|
|
# field name current cell |
|
|
|
|
label = labels[col_number] |
|
|
|
|
setting = place_exp_sett.get(label) |
|
|
|
|
|
|
|
|
|
if setting is None: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
if setting.get('method'): |
|
|
|
|
if cell != "": |
|
|
|
|
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
field_name = setting['field'] |
|
|
|
|
|
|
|
|
|
func = setting.get('func') |
|
|
|
|
if func is None: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
extra_value = setting.get('extra_values') |
|
|
|
|
if extra_value is not None: |
|
|
|
|
# if setting has extra value then |
|
|
|
|
# it is some field like city, theme, tag |
|
|
|
|
# that has relation and can be created |
|
|
|
|
|
|
|
|
|
# in function we add language(need for relation fields) |
|
|
|
|
# and extra value from object (like for city need country) |
|
|
|
|
try: |
|
|
|
|
object = self.model.objects.language(lang).get(id=int(row[0])) |
|
|
|
|
except ValueError: |
|
|
|
|
object = self.model() |
|
|
|
|
object.translate(lang) |
|
|
|
|
extra = getattr(obj, extra_value) |
|
|
|
|
except Exception: |
|
|
|
|
continue |
|
|
|
|
value = func(cell, 'ru', extra) |
|
|
|
|
|
|
|
|
|
except self.model.DoesNotExist: |
|
|
|
|
object = self.model(id= int(row[0])) |
|
|
|
|
object.translate(lang) |
|
|
|
|
else: |
|
|
|
|
# if id blank - its a new event |
|
|
|
|
object = self.model() |
|
|
|
|
object.translate(lang) |
|
|
|
|
methods = [] |
|
|
|
|
for col_number, cell in enumerate(row): |
|
|
|
|
# go through row cells |
|
|
|
|
# field name current cell |
|
|
|
|
label = labels[col_number] |
|
|
|
|
setting = place_exp_sett.get(label) |
|
|
|
|
value = func(cell) |
|
|
|
|
|
|
|
|
|
if setting is None: |
|
|
|
|
continue |
|
|
|
|
try: |
|
|
|
|
setattr(obj, field_name, value) |
|
|
|
|
except ValueError, e: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
if setting.get('method'): |
|
|
|
|
if cell != "": |
|
|
|
|
methods.append({'func': setting['func'], 'value': cell, 'purpose': setting.get('purpose')}) |
|
|
|
|
if field_name !='adress': |
|
|
|
|
try: |
|
|
|
|
setattr(obj, field_name, value) |
|
|
|
|
except ValueError: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
field_name = setting['field'] |
|
|
|
|
else: |
|
|
|
|
#gaddress = google_address(value) |
|
|
|
|
setattr(obj, 'address', google_address(value)) |
|
|
|
|
|
|
|
|
|
if not obj.url: |
|
|
|
|
obj.url = translit_with_separator(obj.name) |
|
|
|
|
try: |
|
|
|
|
obj.save() |
|
|
|
|
|
|
|
|
|
func = setting.get('func') |
|
|
|
|
if func is not None: |
|
|
|
|
extra_value = setting.get('extra_values') |
|
|
|
|
if extra_value is not None: |
|
|
|
|
# if setting has extra value then |
|
|
|
|
# it is some field like city, theme, tag |
|
|
|
|
# that has relation and can be created |
|
|
|
|
except IntegrityError, e: |
|
|
|
|
|
|
|
|
|
# in function we add language(need for relation fields) |
|
|
|
|
# and extra value from object (like for city need country) |
|
|
|
|
value = func(cell, lang, getattr(object, extra_value)) |
|
|
|
|
else: |
|
|
|
|
value = func(cell) |
|
|
|
|
if field_name =='adress': |
|
|
|
|
setattr(object, 'address', google_address(value)) |
|
|
|
|
setattr(object, field_name, value) |
|
|
|
|
error = str(e) |
|
|
|
|
if typical_errors.get(error): |
|
|
|
|
error = typical_errors[error] |
|
|
|
|
if error.startswith('(1062, "Duplicate entry') and error.endswith('for key \'url\'")'): |
|
|
|
|
error = u'Место с таким названием или урлом уже существует' |
|
|
|
|
|
|
|
|
|
errors.append([obj.name, error]) |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
object.save() |
|
|
|
|
for method in methods: |
|
|
|
|
func = method['func'] |
|
|
|
|
if method.get('purpose'): |
|
|
|
|
try: |
|
|
|
|
func(obj, method['value'], method['purpose']) |
|
|
|
|
except Exception, e: |
|
|
|
|
continue |
|
|
|
|
else: |
|
|
|
|
func(obj, method['value']) |
|
|
|
|
|
|
|
|
|
return errors |
|
|
|
|
|
|
|
|
|
except IntegrityError: |
|
|
|
|
continue |
|
|
|
|
#url = object.url + translit_with_separator(object.city.name) |
|
|
|
|
#object.url = url |
|
|
|
|
#object.save() |
|
|
|
|
|
|
|
|
|
for method in methods: |
|
|
|
|
func = method['func'] |
|
|
|
|
if method.get('purpose'): |
|
|
|
|
try: |
|
|
|
|
func(object, method['value'], method['purpose']) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
else: |
|
|
|
|
try: |
|
|
|
|
func(object, method['value']) |
|
|
|
|
except: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ImportPlaceConferenceForm(ImportForm): |
|
|
|
|
@ -217,6 +245,7 @@ typical_errors = {'(1048, "Column \'city_id\' cannot be null")':u'Неправи |
|
|
|
|
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата окончания', |
|
|
|
|
'(1048, "Column \'data_end\' cannot be null")':u'НЕправильный формат или не заполнена дата начала'} |
|
|
|
|
|
|
|
|
|
# event |
|
|
|
|
class ImportEventForm(ImportForm): |
|
|
|
|
""" |
|
|
|
|
extended form for importing one type of event |
|
|
|
|
|