daily commit

remotes/origin/1203
Nazar Kotyuk 12 years ago
parent ac5aca4220
commit 6b178ed049
  1. 56
      city/models.py
  2. 62
      functions/signal_additional_func.py
  3. 11
      functions/translate.py
  4. 27
      import_xls/custom_forms.py
  5. 51
      import_xls/excel_settings.py
  6. 53
      import_xls/views.py
  7. 29
      settings/forms.py
  8. 21
      settings/models.py
  9. 7
      templates/admin/import templates/export_event.html
  10. 8
      templates/admin/import templates/import_event.html
  11. 9
      templates/admin/settings/settings.html
  12. 2
      theme/models.py

@ -1,12 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models, connection from django.db import models
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField from bitfield import BitField
# my models # my models
from directories.models import Iata from directories.models import Iata
from service.models import Service from service.models import Service
# from settings.models import Setting
# custom dunctions
from functions.db import db_table_exists from functions.db import db_table_exists
from functions.form_check import translit_with_separator
from functions.signal_additional_func import fill_missing_languages, fill_meta_information
#check if table exist and create flags if true #check if table exist and create flags if true
flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else [] flags = [str(item.id) for item in Service.objects.all()] if db_table_exists('service_service') else []
@ -48,12 +53,11 @@ class City(TranslatableModel):
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', self.pk) return self.lazy_translation_getter('name', self.pk)
from django.db.models.signals import pre_save, post_save def save(self, *args, **kwargs):
from django.dispatch import receiver
from django.conf import settings super(City, self).save(*args, **kwargs)
from functions.form_check import translit_with_separator
from functions.translate import get_translated_fields
@receiver(post_save) @receiver(post_save)
def city_post_save_handler(sender, **kwargs): def city_post_save_handler(sender, **kwargs):
@ -66,31 +70,25 @@ def city_post_save_handler(sender, **kwargs):
obj = kwargs['instance'] obj = kwargs['instance']
if isinstance(obj, City): if isinstance(obj, City):
# object is City fill_missing_languages(obj)
# what languages must be #fill_meta_information(obj)
all_langs = [code for code, lang in settings.LANGUAGES]
# what languages are
obj_langs = obj.get_available_languages()
#
missing_languages = list(set(all_langs) - set(obj_langs))
# get first Translation object
translation = obj.translations.all()[0]
#
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()
if isinstance(obj, CityTranslation): if isinstance(obj, CityTranslation):
# object is Translation # object is Translation - set url
print('trans')
if obj.language_code == 'ru': if obj.language_code == 'ru':
city = City.objects.get(id=obj.master_id) city = City.objects.get(id=obj.master_id)
country = city.country country = city.country
city.url = '%s-%s'%(translit_with_separator(country.name), translit_with_separator(obj.name)) city.url = '%s-%s'%(translit_with_separator(country.name), translit_with_separator(obj.name))
city.save() city.save()
"""
@receiver(pre_save)
def sett(sender, **kwargs):
obj = kwargs['instance']
if isinstance(obj, CityTranslation):
if obj.title == '111':
obj.title == '222'
obj.save()
"""

@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
from settings.models import settings_dict, Setting
from django.conf import settings
from functions.translate import get_translated_fields
def fill_missing_languages(obj):
all_langs = [code for code, lang in settings.LANGUAGES]
obj_langs = obj.get_available_languages()
missing_languages = list(set(all_langs) - set(obj_langs))
if missing_languages:
# get first Translation object (require)
translation = obj.translations.all()[0]
fields = get_translated_fields(obj)
for code in missing_languages:
# translate
obj.translate(code)
# go through all fields and set value
for field in fields:
setattr(obj, field, getattr(translation, field))
obj.save()
#from city.models import City
#city = City.objects.get(id=37)
#city
#
def fill_meta_information(obj):
s_list = settings_dict.get(obj.__class__.__name__)
if s_list:
for code, lang in settings.LANGUAGES:
fields_with_setting = [(setting.get('field_name'), Setting.objects.get(key=setting['key']).get_value(code)) \
for setting in s_list if setting.get('type') =='transl']
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
for field in fields_with_setting:
setattr(tr, field[0], field[1])
tr.save()
#return fields_with_setting
"""
s_list = settings_dict.get(obj.__class__.__name__)
return s_list
for s in s_list:
setting = Setting.objects.get(key=s.get('key'))
if setting.type != 'transl':
setattr(obj, s.get('field_name'), setting.get_value())
else:
for code, lang in settings.LANGUAGES:
tr = obj._meta.translations_model.objects.get(language_code=code, master__id=getattr(obj, 'id'))
setattr(tr, s.get('field_name'), setting.get_value(code))
tr.save()
"""

@ -99,16 +99,21 @@ def fill_with_signal(model, obj, data):
fields = [field.name for field in model.translations.related.editable_fields() if field.name not in bad_fields] fields = [field.name for field in model.translations.related.editable_fields() if field.name not in bad_fields]
# translate to first language(require) # translate to first language(require)
# ! first save method call signal that fill require language to all translated fields
if not obj.id: if not obj.id:
# new object # new object
# translate into first language
obj.translate(all_langs[0]) obj.translate(all_langs[0])
# go through all fields and set value # go through all fields and set value
for field in fields: for field in fields:
setattr(obj, field, data.get('%s_%s'%(field, all_langs[0]))) setattr(obj, field, data.get('%s_%s'%(field, all_langs[0])))
# first save method call signal that fill require language to all translated fields
obj.save() obj.save()
else:
trans_obj = model._meta.translations_model.objects.get(language_code = all_langs[0],
master__id=getattr(obj, 'id'))
for field in fields:
setattr(trans_obj, field, data.get('%s_%s'%(field, all_langs[0])))
trans_obj.save()
# require translation. uses for substitution unfilled form fields # require translation. uses for substitution unfilled form fields
require_transl = model._meta.translations_model.objects.get(language_code = all_langs[0],master__id=getattr(obj, 'id')) require_transl = model._meta.translations_model.objects.get(language_code = all_langs[0],master__id=getattr(obj, 'id'))

@ -63,11 +63,18 @@ class ImportEventForm(forms.Form):
# in function we add language(need for relation fields) # in function we add language(need for relation fields)
# and extra value from object (like for city need country) # and extra value from object (like for city need country)
value = func(cell, lang, getattr(object, extra_value)) # условие заглушка для мени ту мени
if object.id == None and (field_name=='theme' or field_name=='tag'):
pass
else:
value = func(cell, lang, getattr(object, extra_value))
else: else:
value = func(cell) value = func(cell)
# условие заглушка для мени ту мени
setattr(object, field_name, value) if object.id == None and (field_name=='theme' or field_name=='tag'):
pass
else:
setattr(object, field_name, value)
object.save() object.save()
@ -96,12 +103,7 @@ class ExportEventForm(forms.Form):
if not objects: if not objects:
# not found any objects # not found any objects
return None return None
message = 'По даному запросу объектов не найдено'
args = {}
args.update(csrf(request))
args['message'] = message
args['form'] = form
return render_to_response('export_event.html', args)
workbook = xlwt.Workbook(encoding = 'utf8') workbook = xlwt.Workbook(encoding = 'utf8')
# new tab # new tab
@ -135,9 +137,14 @@ class ExportEventForm(forms.Form):
else: else:
worksheet.write(row+2, col, field.get('type')(value)) worksheet.write(row+2, col, field.get('type')(value))
col += 1 col += 1
return workbook return workbook
def get_fname(self):
data = self.cleaned_data
f_name = data['language']+'_'+data['event'].split('.')[1]\
+' from: %s'%data['date_from']+' to: %s'%data['date_to']+'.xls'
return f_name
def clean_theme(self): def clean_theme(self):
""" """

@ -2,6 +2,7 @@
from country.models import Country from country.models import Country
from city.models import City from city.models import City
from theme.models import Theme, Tag from theme.models import Theme, Tag
from hvad.utils import get_translation_aware_manager
def get_bool(value): def get_bool(value):
if value: if value:
@ -38,7 +39,7 @@ def get_tag(tag, theme):
# list of tags with current theme # list of tags with current theme
tag_list = [str(tag) for tag in tags if tag.theme == theme] tag_list = [str(tag) for tag in tags if tag.theme == theme]
result += '['+','.join(tag_list)+']' result += '['+', '.join(tag_list)+']'
return result return result
@ -47,17 +48,17 @@ def get_tag(tag, theme):
field_settings = [ field_settings = [
{'name': 'id', 'verbose_name': 'id', 'type': get_int, 'width':1500}, {'name': 'id', 'verbose_name': 'id', 'type': get_int, 'width':1500},
{'name': 'url', 'verbose_name': 'url', 'type': str}, {'name': 'url', 'verbose_name': 'url', 'type': str},
{'name': 'name', 'verbose_name': 'Имя', 'type': str, 'width':8000,}, {'name': 'name', 'verbose_name': 'Имя', 'type': str, 'width':8000},
{'name': 'data_begin', 'verbose_name': 'Дата начала', 'type': str}, {'name': 'data_begin', 'verbose_name': 'Дата начала', 'type': str},
{'name': 'data_end', 'verbose_name': 'Дата окончания', 'type': str}, {'name': 'data_end', 'verbose_name': 'Дата окончания', 'type': str},
{'name': 'audience', 'verbose_name': 'Аудитория', 'type': get_audience},
{'name': 'main_title', 'verbose_name': 'Краткое описание', 'type': str}, {'name': 'main_title', 'verbose_name': 'Краткое описание', 'type': str},
{'name': 'description', 'verbose_name': 'Описание', 'type': str}, {'name': 'description', 'verbose_name': 'Описание', 'type': str},
{'name': 'audience', 'verbose_name': 'Аудитория', 'type': get_audience},
{'name': 'country', 'verbose_name': 'Страна', 'type': str}, {'name': 'country', 'verbose_name': 'Страна', 'type': str},
{'name': 'city', 'verbose_name': 'Город', 'type': str}, {'name': 'city', 'verbose_name': 'Город', 'type': str},
{'name': 'theme', 'verbose_name': 'Тематика', 'type': get_theme}, {'name': 'theme', 'verbose_name': 'Тематика', 'type': get_theme, 'width':8000},
{'name': 'tag', 'verbose_name': 'Теги', 'type': get_tag}, {'name': 'tag', 'verbose_name': 'Теги', 'type': get_tag, 'width':8000},
{'name': 'periodic', 'verbose_name': 'Периодичность', 'type': str}, #{'name': 'periodic', 'verbose_name': 'Периодичность', 'type': str},
{'name': 'web_page', 'verbose_name': 'Веб страница', 'type': str}, {'name': 'web_page', 'verbose_name': 'Веб страница', 'type': str},
{'name': 'time', 'verbose_name': 'Время проведения', 'type': str}, {'name': 'time', 'verbose_name': 'Время проведения', 'type': str},
{'name': 'products', 'verbose_name': 'Экспонируемые продукты', 'type': str}, {'name': 'products', 'verbose_name': 'Экспонируемые продукты', 'type': str},
@ -75,8 +76,8 @@ field_settings = [
{'name': 'max_open_area', 'verbose_name': 'Максимальная цена открытой площади', 'type': get_int}, {'name': 'max_open_area', 'verbose_name': 'Максимальная цена открытой площади', 'type': get_int},
{'name': 'min_area', 'verbose_name': 'Минимальная площадь', 'type': get_int}, {'name': 'min_area', 'verbose_name': 'Минимальная площадь', 'type': get_int},
{'name': 'max_area', 'verbose_name': 'Максимальная площадь', 'type': get_int}, {'name': 'max_area', 'verbose_name': 'Максимальная площадь', 'type': get_int},
{'name': 'is_published', 'verbose_name': 'Опубликована', 'type': get_bool, 'width':1000}, {'name': 'is_published', 'verbose_name': 'Опубликована', 'type': get_bool},
{'name': 'canceled_by_administrator', 'verbose_name': 'Отменена администратором', 'type': get_bool, 'width':1000} {'name': 'canceled_by_administrator', 'verbose_name': 'Отменена администратором', 'type': get_bool}
] ]
@ -93,7 +94,7 @@ def to_int(val):
return None return None
from hvad.utils import get_translation_aware_manager
def to_country(value): def to_country(value):
try: try:
query = get_translation_aware_manager(Country) query = get_translation_aware_manager(Country)
@ -140,8 +141,10 @@ def to_theme(value, lang='ru'):
theme_names = value.split(', ') theme_names = value.split(', ')
theme_objects = [] theme_objects = []
for name in theme_names: for name in theme_names:
try: try:
theme = Theme.objects.get(name=name) objects = get_translation_aware_manager(Theme)
theme = objects.filter(name=name)[0]
except: except:
theme = Theme() theme = Theme()
theme.translate(lang) theme.translate(lang)
@ -152,9 +155,30 @@ def to_theme(value, lang='ru'):
return theme_objects return theme_objects
#def to_tag(value): def to_tag(value, lang, themes):
value = value.replace('[', '')
themes = themes.all()
# list tags by themes
value = value.split(']')
arr = []
bla = value[0].split(', ')
for theme_number, theme in enumerate(themes):
for val in value[theme_number].split(', '):
if val:
try:
objects = get_translation_aware_manager(Tag)
tag = objects.language(lang).filter(name=val, theme=theme)
tag = tag[0]
except:
tag = Tag()
tag.theme = theme
tag.translate(lang)
tag.name = val
tag.save()
arr.append(tag)
return arr
@ -169,6 +193,7 @@ import_settings={
'country': {'func': to_country}, 'country': {'func': to_country},
'city': {'func': to_city, 'extra_values': 'country'}, 'city': {'func': to_city, 'extra_values': 'country'},
'theme': {'func': to_theme}, 'theme': {'func': to_theme},
'tag': {'func': to_tag, 'extra_values': 'theme'},
'periodic': {'func': str}, 'periodic': {'func': str},
'web_page': {'func': str}, 'web_page': {'func': str},
'time': {'func': str}, 'time': {'func': str},

@ -48,57 +48,8 @@ def export_event(request):
if workbook is None: if workbook is None:
pass pass
else: else:
return xls_to_response(workbook, 'My Worksheet.xls') f_name = form.get_fname()
""" return xls_to_response(workbook, f_name)
data = form.cleaned_data
# get model
model = get_model(data['event'].split('.')[0], data['event'].split('.')[1])
# get objects
objects = model.objects.language(data['language']).filter(data_begin__range=[data['date_from'], data['date_to']],
country__in=data['country'],
theme__in=data['theme']
).distinct()
if not objects:
# not found any objects
message = 'По даному запросу объектов не найдено'
args = {}
args.update(csrf(request))
args['message'] = message
args['form'] = form
return render_to_response('export_event.html', args)
workbook = xlwt.Workbook(encoding = 'utf8')
# new tab
worksheet = workbook.add_sheet('My Worksheet')
# Create the Font for first rows
font = xlwt.Font()
font.name = 'Times New Roman'
font.bold = True
style = xlwt.XFStyle()
# Create the Style
style.font = font
for row, object in enumerate(objects):
# column number
col = 0
for field in field_settings:
try:
value = getattr(object, field['name'])
except AttributeError:
# doesnt have such field. exit from iteration
continue
if row == 0:
# first iteration. set names. set columns width
worksheet.write(0, col, field.get('verbose_name', 'default'), style)
worksheet.write(1, col, field.get('name'), style)
worksheet.col(col).width = field.get('width', 3333)
worksheet.write(row+2, col, field.get('type')(value))
col += 1
"""
#return xls_to_response(workbook, 'My Worksheet.xls') #return xls_to_response(workbook, 'My Worksheet.xls')
else: else:

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django import forms from django import forms
from models import Setting from models import Setting, settings_dict
from django.conf import settings from django.conf import settings
from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all
@ -18,6 +18,25 @@ class SettingsForm(forms.Form):
super(SettingsForm, self).__init__(*args, **kwargs) super(SettingsForm, self).__init__(*args, **kwargs)
# creates translated form fields, example: name_ru, name_en # creates translated form fields, example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
for model_name in settings_dict.values():
for setting in model_name:
item = Setting.objects.get(key=setting['key'])
if setting['type'] != 'transl':
self.fields[setting['key']] = forms.CharField(label=setting['verbose_name'], initial=item.get_value(),
required=False)
else:
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# using enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['%s_%s' %(setting['key'], code)] = forms.CharField(label=setting['verbose_name'],
initial=item.get_value(code),
required=required,
widget=forms.TextInput(
attrs={'style':'width: 450px'}))
"""
settings_list = Setting.objects.all() settings_list = Setting.objects.all()
for item in settings_list: for item in settings_list:
if item.type != 'transl': if item.type != 'transl':
@ -29,8 +48,12 @@ class SettingsForm(forms.Form):
# using enumerate for detect iteration number # using enumerate for detect iteration number
# first iteration is a default lang so it required fields # first iteration is a default lang so it required fields
required = True if lid == 0 else False required = True if lid == 0 else False
self.fields['%s_%s' %(item.key, code)] = forms.CharField(label=getattr(item, 'key'), initial=item.get_value(code), self.fields['%s_%s' %(item.key, code)] = forms.CharField(label=getattr(item, 'key'),
required=required,widget=forms.TextInput(attrs={'style':'width: 450px'})) initial=item.get_value(code),
required=required,
widget=forms.TextInput(
attrs={'style':'width: 450px'}))
"""
def save(self): def save(self):

@ -14,6 +14,8 @@ class Setting(TranslatableModel):
Create Settings model, which stores different settings of project Create Settings model, which stores different settings of project
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
Setting create only by admin
""" """
VALUES = ('int', 'text', 'transl', 'date') VALUES = ('int', 'text', 'transl', 'date')
@ -54,6 +56,25 @@ class Setting(TranslatableModel):
else: else:
setattr(self, self.type, value) setattr(self, self.type, value)
# dictionaty of models settings
# every model have list of settings
# key: setting in db, field_name: field in model
settings_dict = dict(City=[{'key': 'city_title', 'field_name': 'title', 'type': 'transl', 'verbose_name': 'title Городов'},
{'key': 'city_keywords', 'field_name': 'keywords', 'type': 'transl', 'verbose_name': 'keywords'},
{'key': 'city_descriptions', 'field_name': 'descriptions', 'type': 'transl', 'verbose_name': 'description'}],
#Country=[{'key': 'country_title', 'type': 'transl', 'verbose_name': 'title'},
# {'key': 'country_keywords', 'type': 'transl', 'verbose_name': 'keywords'},
# {'key': 'country_descriptions', 'type': 'transl', 'verbose_name': 'description'}]
)
#from settings.models import settings, Setting
#country_set = settings.get('country')
#for s in country_set:
# set = Setting(key=s['key'], type=s['type'])
# set.save()
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver

@ -76,6 +76,13 @@
</div> </div>
</div> </div>
<div class="alert">
<p>Дата обязательна. Если направление или страна не заплолнено выборка по всем направлениям или странам</p>
</div>
<div class="controls"> <div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Экспорт"> <input class="btn btn-large btn-primary" type="submit" value="Экспорт">
<input class="btn btn-large" type="reset" value="Отмена"> <input class="btn btn-large" type="reset" value="Отмена">

@ -33,11 +33,13 @@
</div> </div>
<div class="alert"> <div class="alert">
<p>Поле id менять для редактирования старого события</p> <p>Обязательные поля: Имя, дата начала, дата окончания, страна, город, тематика, валюта</p>
<hr> <hr>
<p>Для создания нового события оставить поле id пустым</p> <p>Поле id не менять для редактирования старого события. Для создания нового события оставить поле id пустым</p>
<hr> <hr>
<p>Город должен быть после страны, а тег после тематики</p> <p>Город должен быть после страны, а тег после тематики, для коректного сохранения даных</p>
</div> </div>
<div class="controls"> <div class="controls">

@ -6,12 +6,17 @@
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %} <form method="post" class="form-horizontal" enctype="multipart/form-data" name="form1" id="form1"> {% csrf_token %}
{# template hall placeconference #} {# template hall placeconference #}
{% with field='place_conf_hall' form=form languages=languages %} {% with field='city_title' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}
{% endwith %} {% endwith %}
{# template hall placeexposition #} {# template hall placeexposition #}
{% with field='place_exp_hall' form=form languages=languages %} {% with field='city_descriptions' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
{# template hall placeexposition #}
{% with field='city_keywords' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}
{% endwith %} {% endwith %}

@ -100,7 +100,7 @@ class Tag(TranslatableModel):
#set manager of this model #set manager of this model
objects = TagManager() objects = TagManager()
theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name='themes') theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name='tags')
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(max_length=100), name = models.CharField(max_length=100),

Loading…
Cancel
Save