# -*- coding: utf-8 -*- from django import forms from django.conf import settings from theme.models import Theme from country.models import Country from django.db.models.loading import get_model import xlrd, xlwt from excel_settings import import_settings, field_settings languages = [code for code in settings.LANGUAGES] class ImportEventForm(forms.Form): excel_file = forms.FileField(label='Выберите файл') event = forms.ChoiceField(label='Выберите тип события', choices=[('exposition.Exposition', 'Выставка'), ('conference.Conference', 'Конференция'), ('seminar.Seminar', 'Семинар'), ('webinar.Webinar', 'Вебинар')]) language = forms.ChoiceField(label='Выберите язык', choices=languages) def save_events(self): """ save events from excel file in language from form """ data = self.cleaned_data lang = data['language'] f = data['excel_file'] 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)] # all field names in excel file (must be in second row) field_names = [name for name in row_list[1]] # model model = get_model(data['event'].split('.')[0], data['event'].split('.')[1]) for row_number, row in enumerate(row_list): # go through all rows in file if row_number > 1: # first two fields are verbose name and name if row[0] != '': # in first column ids object = model.objects.language(lang).get(id=row[0]) else: # if id blank - its a new event object = model() object.translate(lang) for col_number, cell in enumerate(row): # go through row cells # field name current cell field_name = field_names[col_number] setting = import_settings.get(field_name) if setting is not None: # if setting exist for this field 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 # in function we add language(need for relation fields) # and extra value from object (like for city need country) # условие заглушка для мени ту мени if object.id == None and (field_name=='theme' or field_name=='tag'): pass else: value = func(cell, lang, getattr(object, extra_value)) else: value = func(cell) # условие заглушка для мени ту мени if object.id == None and (field_name=='theme' or field_name=='tag'): pass else: setattr(object, field_name, value) object.save() class ExportEventForm(forms.Form): event = forms.ChoiceField(label='Выберите тип события', choices=[('exposition.Exposition', 'Выставка'), ('conference.Conference', 'Конференция'), ('seminar.Seminar', 'Семинар'), ('webinar.Webinar', 'Вебинар')]) language = forms.ChoiceField(label='Выберите язык', choices=languages) date_from = forms.DateField(label='С') date_to = forms.DateField(label='До') theme = forms.ModelMultipleChoiceField(label='Направление', queryset=Theme.objects.all(), required=False) country = forms.ModelMultipleChoiceField(label='Страны', queryset=Country.objects.all(), required=False) def export_events(self): data = self.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 return None 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) if field['name']=='tag': worksheet.write(row+2, col, field.get('type')(value, object.theme)) else: worksheet.write(row+2, col, field.get('type')(value)) col += 1 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): """ Set all themes if no theme selected """ theme = self.cleaned_data.get('theme') if not theme: theme = Theme.objects.all() return theme def clean_country(self): """ Set all countries if no country selected """ country = self.cleaned_data.get('country') if not country: country = Country.objects.all() return country