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
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
|
|
|