remotes/origin/1203
Kotiuk Nazarii 11 years ago
commit 7419dcae63
  1. 10
      import_xls/admin.py
  2. 2
      import_xls/excel_settings.py
  3. 155
      import_xls/import_forms.py
  4. 9
      import_xls/utils.py
  5. 21
      templates/admin/import templates/import.html

@ -27,13 +27,17 @@ class ImportView(FormView):
"""
abstract class
"""
template_name = 'import.html'
template_name = 'admin/import templates/import.html'
def form_valid(self, form):
form.save_file()
errors = form.save_file()
messages.success(self.request, 'Success')
context = self.get_context_data()
context['import_errors'] = errors
context['form'] = form
return render_to_response(self.template_name, context)
return super(ImportView, self).form_valid(form)
class ExportView(FormView):

@ -280,7 +280,7 @@ place_exp_sett = {
u'Тип':{u'field': u'type', u'func': to_type},
u'Краткое описание':{u'field': u'main_title', u'func': unicode},
u'Страна':{u'field': u'country', u'func': to_country},
u'Город':{u'field': u'city', u'func': to_city, 'extra_values': 'country'},
u'Город':{u'field': u'city_id', u'func': to_city, 'extra_values': 'country'},
u'Описание':{u'field': u'description', u'func': unicode},
u'Адрес':{u'field': u'adress', u'func': unicode},
u'Тел.':{u'field': u'phone', u'func': to_phone},

@ -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

@ -62,12 +62,12 @@ def to_country(value):
return None
def to_city(value, lang, country):
try:
# get city by name
#objects = get_translation_aware_manager(City)
# except IndexError if no found
city = City.objects.filter(translations__name=value, country=country)[0]
# print(city)
return city.id
except IndexError:
print('---------city error------------')
@ -154,14 +154,19 @@ def get_audience(value):
return ', '.join(new_list)
return ''
import types
def save_logo(obj, path):
if not path:
return None
file_name = path.split('/')[-1]
logo_path = obj.logo.field.upload_to
if isinstance(logo_path, types.FunctionType):
logo_path = logo_path(obj, obj.url)
logo_path = '/'.join(logo_path.split('/')[:-1])
full_path = settings.MEDIA_ROOT + logo_path
try:
alt_name = get_alternative_filename(full_path, file_name)
except UnicodeEncodeError:

@ -62,6 +62,26 @@
{% endfor %}
{% endif %}
{% if import_errors %}
<div id="import_errors">
<table class="table table-hover">
<thead>
<tr>
<th>Событие</th>
<th>Ошибка</th>
</tr>
</thead>
<tbody>
{% for error in import_errors %}
<tr>
<td>{{ error.0 }}</td>
<td>{{ error.1 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
<script>
$(document).ready(function(){
setTimeout(function(){
@ -70,4 +90,5 @@
});
</script>
{% endblock %}
Loading…
Cancel
Save