# -*- coding: utf-8 -*- from django import forms from django.conf import settings from django.utils import translation from theme.models import Theme, Tag from country.models import Country from city.models import City from organiser.models import Organiser from accounts.models import User from company.models import Company from article.models import Article from place_exposition.models import PlaceExposition from place_conference.models import PlaceConference from django.db.models.loading import get_model import xlwt from excel_settings import import_settings, field_settings, event_export_sett languages = [code for code in settings.LANGUAGES] class ExportForm(forms.Form): def __init__(self, *args, **kwargs): super(ExportForm, self).__init__(*args, **kwargs) self.workbook = xlwt.Workbook(encoding = 'utf8') self.worksheet = self.workbook.add_sheet('My Worksheet') self.font = xlwt.Font() self.font.name = 'Times New Roman' self.font.bold = True self.style = xlwt.XFStyle() # Create the Style self.style.font = self.font model = None language = forms.ChoiceField(label='Выберите язык', choices=languages) def get_objects(self, data): return self.model.objects.language(data['language']).all() def get_fname(self): return 'export list.xls' def export(self): data = self.cleaned_data objects = self.get_objects(data) if not objects: # not found any objects return None 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 self.worksheet.write(0, col, field.get('verbose_name', 'default'), self.style) self.worksheet.write(1, col, field.get('name'), self.style) self.worksheet.col(col).width = field.get('width', 3333) if field['name']=='tag': self.worksheet.write(row+2, col, field.get('type')(value, object.theme)) else: self.worksheet.write(row+2, col, field.get('type')(value)) col += 1 return self.workbook class ExportOrganiserForm(ExportForm): model = Organiser def get_fname(self): return 'organisers.xls' class ExportUserForm(ExportForm): model = User def get_objects(self, data): return self.model.objects.all() def get_fname(self): return 'users.xls' class ExportThemeForm(ExportForm): model = Theme def get_fname(self): return 'themes.xls' class ExportTagForm(ExportForm): model = Tag def get_fname(self): return 'tags.xls' from excel_settings import place_settings class ExportPlaceExpositionForm(ExportForm): model = PlaceExposition def export(self): data = self.cleaned_data objects = self.get_objects(data) if not objects: # not found any objects return None for row, object in enumerate(objects): # column number col = 0 for field in place_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 self.worksheet.write(0, col, field.get('verbose_name', 'default'), self.style) #self.worksheet.write(1, col, field.get('name'), self.style) self.worksheet.col(col).width = field.get('width', 3333) if field['name']=='tag': self.worksheet.write(row+1, col, field.get('type')(value, object.theme)) else: self.worksheet.write(row+1, col, field.get('type')(value)) col += 1 return self.workbook def get_fname(self): return 'places.xls' class ExportPlaceConferenceForm(ExportForm): model = PlaceConference def get_fname(self): return 'places.xls' class ExportCompanyForm(ExportForm): model = Company def get_fname(self): return 'companies.xls' class ExportBlogForm(ExportForm): model = Article def get_fname(self): return 'blogs.xls' def get_objects(self, data): translation.activate(data['language']) return self.model.objects.blogs() class ExportCityForm(ExportForm): model = City def get_fname(self): return 'cities.xls' def get_objects(self, data): translation.activate(data['language']) return self.model.used.all() 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='С', input_formats=settings.CLIENT_DATE_FORMAT) date_to = forms.DateField(label='До', input_formats=settings.CLIENT_DATE_FORMAT) theme = forms.ModelMultipleChoiceField(label='Направление', queryset=Theme.objects.all(), required=False) country = forms.ModelMultipleChoiceField(label='Страны', queryset=Country.objects.all(), required=False) def export(self): data = self.cleaned_data # get model model = get_model(data['event'].split('.')[0], data['event'].split('.')[1]) lang, date_from, date_to, co, th = data['language'], data['date_from'], data['date_to'], data['country'], data['theme'] # get objects qs = model.objects.language(lang).filter(data_begin__range=[date_from, date_to]) if co: qs = qs.filter(country__in=co) if th: qs = qs.filter(theme__in=th) objects = list(qs.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 event_export_sett: 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.col(col).width = field.get('width', 3333) if field['name'] != 'quality_label': worksheet.write(row+1, col, field.get('type')(value)) else: worksheet.write(row+1, col, field.get('type')(value, field['verbose_name'])) 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: return None return theme def clean_country(self): """ Set all countries if no country selected """ country = self.cleaned_data.get('country') if not country: return None return country