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.
 
 
 
 
 
 

261 lines
8.2 KiB

# -*- 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 field_settings, event_export_sett
from django.utils.translation import ugettext as _
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=_(u'Выберите язык'), 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 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)
self.worksheet.write(row+1, col, field.get('type')(value))
col += 1
return self.workbook
def get_fname(self):
return 'places.xls'
class ExportPlaceConferenceForm(ExportPlaceExpositionForm):
model = PlaceConference
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=_(u'Выберите тип события'), choices=[('exposition.Exposition', _(u'Выставка')),
('conference.Conference', _(u'Конференция')),
('seminar.Seminar', _(u'Семинар')),
('webinar.Webinar', _(u'Вебинар'))])
language = forms.ChoiceField(label=_(u'Выберите язык'), choices=languages)
date_from = forms.DateField(label=_(u'С'), input_formats=settings.CLIENT_DATE_FORMAT)
date_to = forms.DateField(label=_(u'До'), input_formats=settings.CLIENT_DATE_FORMAT)
theme = forms.ModelMultipleChoiceField(label=_(u'Направление'), queryset=Theme.objects.all(), required=False)
country = forms.ModelMultipleChoiceField(label=_(u'Страны'), 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