You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
6.7 KiB

# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from theme.models import Theme, Tag
from country.models import Country
from organiser.models import Organiser
from accounts.models import User
from company.models import Company
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
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'
class ExportPlaceExpositionForm(ExportForm):
model = PlaceExposition
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 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(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