@ -0,0 +1,14 @@ |
||||
from haystack import indexes |
||||
from models import User |
||||
|
||||
|
||||
class UserIndex(indexes.SearchIndex, indexes.Indexable): |
||||
text = indexes.CharField(document=True, use_template=True) |
||||
first_name = indexes.CharField(model_attr='first_name') |
||||
|
||||
|
||||
def get_model(self): |
||||
return User |
||||
|
||||
def index_queryset(self, using=None): |
||||
return self.get_model().objects.all() |
||||
@ -1,8 +1,3 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.db.models.signals import post_save |
||||
from models import City |
||||
from functions.signal_handlers import post_save_handler |
||||
|
||||
post_save.connect(post_save_handler, sender=City) |
||||
|
||||
|
||||
|
||||
@ -0,0 +1,10 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, url |
||||
from views import CompanyView |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'members/(?P<params>.*)/(?P<page>\d+)/$', CompanyView.as_view()), |
||||
url(r'members/(?P<page>\d+)/$', CompanyView.as_view()), |
||||
url(r'members/(?P<params>.*)/$', CompanyView.as_view()), |
||||
url(r'members/$', CompanyView.as_view()), |
||||
) |
||||
@ -0,0 +1,22 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.http import HttpResponse |
||||
from models import Company |
||||
from functions.custom_views import ExpoListView |
||||
import json |
||||
|
||||
class CompanyView(ExpoListView): |
||||
model = Company |
||||
template_name = 'company_catalog.html' |
||||
|
||||
class CompanyExposition(CompanyView): |
||||
template_name = 'test_list.html' |
||||
|
||||
def get_queryset(self): |
||||
|
||||
params = self.get_params() |
||||
for param in params: |
||||
if param.get('type') == 'event': |
||||
company = Company.objects.safe_get(url=param.get('url')) |
||||
#query = exp.users |
||||
self.params = params |
||||
return company.exposition_companies.all() |
||||
@ -0,0 +1,15 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, include, url |
||||
from views import ConferenceView |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'conferences/(?P<params>.*)/(?P<page>\d+)/$', ConferenceView.as_view()), |
||||
url(r'conferences/(?P<page>\d+)/$', ConferenceView.as_view()), |
||||
url(r'conferences/(?P<params>.*)/$', ConferenceView.as_view()), |
||||
url(r'conferences/$', ConferenceView.as_view()), |
||||
# |
||||
url(r'conference-add-calendar/(?P<id>\d+)/$', 'conference.views.conference_add_calendar'), |
||||
url(r'conference-remove-calendar/(?P<id>\d+)/$', 'conference.views.conference_remove_calendar'), |
||||
url(r'conference-visit/(?P<id>\d+)/$', 'conference.views.conference_visit'), |
||||
url(r'conference-unvisit/(?P<id>\d+)/$', 'conference.views.conference_unvisit'), |
||||
) |
||||
@ -0,0 +1,70 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.http import HttpResponse |
||||
from models import Conference |
||||
from functions.custom_views import ExpoListView |
||||
import json |
||||
|
||||
class ConferenceView(ExpoListView): |
||||
model = Conference |
||||
template_name = 'event_catalog.html' |
||||
|
||||
def conference_add_calendar(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
|
||||
if user.is_authenticated(): |
||||
conf = Conference.objects.safe_get(id=id) |
||||
if conf: |
||||
user.calendar.conferences.add(conf) |
||||
args['success'] = True |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def conference_remove_calendar(request, id): |
||||
args = {'success': False} |
||||
if request.user: |
||||
user = request.user |
||||
conf = Conference.objects.safe_get(id=id) |
||||
if conf: |
||||
user.calendar.conferences.remove(conf) |
||||
args['success'] = True |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def conference_visit(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
if user.is_authenticated(): |
||||
conf = Conference.objects.safe_get(id=id) |
||||
if conf: |
||||
conf.users.add(user) |
||||
args['success'] = True |
||||
|
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def conference_unvisit(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
if user.is_authenticated(): |
||||
conf = Conference.objects.safe_get(id=id) |
||||
if conf: |
||||
conf.users.remove(user) |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
|
||||
|
||||
@ -0,0 +1,3 @@ |
||||
from django.db import models |
||||
|
||||
# Create your models here. |
||||
@ -0,0 +1,16 @@ |
||||
""" |
||||
This file demonstrates writing tests using the unittest module. These will pass |
||||
when you run "manage.py test". |
||||
|
||||
Replace this with more appropriate tests for your application. |
||||
""" |
||||
|
||||
from django.test import TestCase |
||||
|
||||
|
||||
class SimpleTest(TestCase): |
||||
def test_basic_addition(self): |
||||
""" |
||||
Tests that 1 + 1 always equals 2. |
||||
""" |
||||
self.assertEqual(1 + 1, 2) |
||||
@ -0,0 +1,77 @@ |
||||
# -*- coding: utf-8 -*- |
||||
|
||||
from country.models import Country |
||||
from city.models import City |
||||
from place_exposition.models import PlaceExposition |
||||
from place_conference.models import PlaceConference |
||||
from django.views.generic import ListView |
||||
from functions.views_help import split_params |
||||
from django.utils.translation import ugettext as _ |
||||
|
||||
|
||||
class PlaceListView(ListView): |
||||
paginate_by = 2 |
||||
params = None |
||||
single_page = False |
||||
template_name = 'place_catalog_test.html' |
||||
model = 'places' |
||||
|
||||
def get_params(self): |
||||
model_names = {'places': _(u'Места')} |
||||
model_alternative_name = {'places': 'place'} |
||||
params = [{'type':'model', 'url':self.model, 'name': model_names.get(self.model), |
||||
'alternative_name': model_alternative_name.get(self.model)}] |
||||
|
||||
st = self.kwargs.get('params') |
||||
if st: |
||||
params = params + split_params(st) |
||||
|
||||
return params |
||||
|
||||
def get_queryset(self): |
||||
pl_ex = PlaceExposition.objects.all() |
||||
pl_conf = PlaceConference.objects.all() |
||||
|
||||
params = self.get_params() |
||||
for param in params: |
||||
|
||||
if param.get('type') == 'country': |
||||
country = Country.objects.safe_get(url=param.get('url')) |
||||
if country: |
||||
param['name'] = country.name |
||||
pl_ex = pl_ex.filter(country=country) |
||||
pl_conf = pl_conf.filter(country=country) |
||||
if param.get('type') == 'city': |
||||
city = City.objects.safe_get(url=param.get('url')) |
||||
if city: |
||||
param['name'] = city.name |
||||
pl_ex = pl_ex.filter(city=city) |
||||
pl_conf = pl_conf.filter(city=city) |
||||
|
||||
if param.get('type') == 'place': |
||||
pl_ex = pl_ex.filter(url=param.get('url')) |
||||
if pl_ex: |
||||
query = pl_ex |
||||
else: |
||||
query = pl_conf.filter(url=param.get('url')) |
||||
|
||||
self.single_page = True |
||||
|
||||
if query: |
||||
param['name'] = query[0].name |
||||
|
||||
#if self.request: |
||||
# views = query[0].views |
||||
# query.update(views=views+1) |
||||
self.params = params |
||||
return query |
||||
|
||||
self.params = params |
||||
return list(pl_ex) + list(pl_conf) |
||||
|
||||
|
||||
def get_context_data(self, **kwargs): |
||||
context = super(PlaceListView, self).get_context_data(**kwargs) |
||||
context['filter'] = self.params |
||||
context['single_page'] = self.single_page |
||||
return context |
||||
@ -0,0 +1,15 @@ |
||||
""" |
||||
from haystack import indexes |
||||
from models import Exposition |
||||
|
||||
|
||||
class ExpositionIndex(indexes.SearchIndex, indexes.Indexable): |
||||
text = indexes.CharField(document=True) |
||||
|
||||
|
||||
def get_model(self): |
||||
return Exposition |
||||
|
||||
def index_queryset(self, using=None): |
||||
return self.get_model().objects.filter() |
||||
""" |
||||
@ -0,0 +1,18 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, include, url |
||||
from views import ExpositionView, ExpositionVisitors, ExpositionMembers |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'expositions/(?P<params>.*)/(?P<page>\d+)/$', ExpositionView.as_view()), |
||||
url(r'expositions/(?P<page>\d+)/$', ExpositionView.as_view()), |
||||
url(r'expositions/(?P<params>.*)/visitors/$', ExpositionVisitors.as_view()), |
||||
url(r'expositions/(?P<params>.*)/members/$', ExpositionMembers.as_view()), |
||||
url(r'expositions/(?P<params>.*)/$', ExpositionView.as_view()), |
||||
url(r'expositions/$', ExpositionView.as_view()), |
||||
# |
||||
url(r'exposition-add-calendar/(?P<id>\d+)/$', 'exposition.views.exposition_add_calendar'), |
||||
url(r'exposition-remove-calendar/(?P<id>\d+)/$', 'exposition.views.exposition_remove_calendar'), |
||||
url(r'exposition-visit/(?P<id>\d+)/$', 'exposition.views.exposition_visit'), |
||||
url(r'exposition-unvisit/(?P<id>\d+)/$', 'exposition.views.exposition_unvisit'), |
||||
|
||||
) |
||||
@ -0,0 +1,118 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.shortcuts import render_to_response |
||||
from django.http import HttpResponseRedirect, HttpResponse |
||||
from django.template import RequestContext |
||||
from django.shortcuts import get_object_or_404 |
||||
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage |
||||
#models |
||||
from models import Exposition |
||||
from accounts.models import User |
||||
from functions.custom_views import ExpoListView, ExpoMixin |
||||
from django.views.generic import ListView |
||||
# |
||||
import json |
||||
from django.utils.translation import ugettext as _ |
||||
|
||||
class ExpositionView(ExpoListView): |
||||
model = Exposition |
||||
template_name = 'event_catalog.html' |
||||
|
||||
class ExpositionVisitors(ExpositionView): |
||||
model = Exposition |
||||
template_name = 'event_visitors.html' |
||||
|
||||
def get_queryset(self): |
||||
|
||||
params = self.get_params() |
||||
for param in params: |
||||
if param.get('type') == 'event': |
||||
exp = Exposition.objects.safe_get(url=param.get('url')) |
||||
#query = exp.users |
||||
param['name'] = exp.name |
||||
params.append({'type':'visitors', 'name':_(u'Посетители')}) |
||||
|
||||
self.params = params |
||||
return exp.users.all() |
||||
|
||||
|
||||
class ExpositionMembers(ExpoListView): |
||||
model = Exposition |
||||
template_name = 'event_members.html' |
||||
|
||||
def get_queryset(self): |
||||
|
||||
params = self.get_params() |
||||
for param in params: |
||||
if param.get('type') == 'event': |
||||
exp = Exposition.objects.safe_get(url=param.get('url')) |
||||
param['name'] = exp.name |
||||
#query = exp.users |
||||
params.append({'type':'members', 'name':_(u'Участники')}) |
||||
self.params = params |
||||
return exp.company.all() |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def exposition_add_calendar(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
|
||||
if user.is_authenticated(): |
||||
exp = Exposition.objects.safe_get(id=id) |
||||
if exp: |
||||
user.calendar.expositions.add(exp) |
||||
args['success'] = True |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def exposition_remove_calendar(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
|
||||
if user.is_authenticated(): |
||||
exp = Exposition.objects.safe_get(id=id) |
||||
if exp: |
||||
user.calendar.expositions.remove(exp) |
||||
args['success'] = True |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def exposition_visit(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
if user.is_authenticated(): |
||||
exp = Exposition.objects.safe_get(id=id) |
||||
if exp: |
||||
exp.users.add(user) |
||||
args['success'] = True |
||||
|
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
|
||||
def exposition_unvisit(request, id): |
||||
args = {'success': False} |
||||
user = request.user |
||||
if user.is_authenticated(): |
||||
exp = Exposition.objects.safe_get(id=id) |
||||
if exp: |
||||
exp.users.remove(user) |
||||
else: |
||||
args['not_authorized'] = True |
||||
args['success'] = True |
||||
|
||||
return HttpResponse(json.dumps(args), content_type='application/json') |
||||
@ -0,0 +1,18 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from django.utils.translation import ugettext_lazy as _ |
||||
from theme.models import Theme |
||||
|
||||
class AdminSearchForm(forms.Form): |
||||
search_name = forms.CharField(required=False, max_length=50) |
||||
|
||||
|
||||
class ThemeSearch(forms.Form): |
||||
event = forms.MultipleChoiceField(required=False,widget=forms.CheckboxSelectMultiple, choices=[(0, _(u'выставки')), |
||||
(1, _(u'конференции')), |
||||
(2, _(u'семинары')), |
||||
(3, _(u'вебинары'))]) |
||||
theme = forms.ModelMultipleChoiceField(required=False, queryset=Theme.objects.all(), |
||||
widget=forms.CheckboxSelectMultiple) |
||||
|
||||
|
||||
@ -0,0 +1,61 @@ |
||||
from service.models import Service |
||||
|
||||
class ExpoMixin(object): |
||||
def get_logo(self): |
||||
|
||||
logo = self.files.filter(purpose='logo') |
||||
if logo: |
||||
return logo[0] |
||||
return logo |
||||
|
||||
def get_preview(self): |
||||
|
||||
preview = self.files.filter(purpose='preview') |
||||
if preview: |
||||
return preview[0] |
||||
return preview |
||||
|
||||
def get_photos(self): |
||||
photos = self.files.filter(purpose='photo') |
||||
return photos |
||||
|
||||
|
||||
class EventMixin(object): |
||||
def get_permanent_url(self): |
||||
url = '%sevent-%s'%(self.get_catalog_url(), self.url) |
||||
return url |
||||
|
||||
def get_logo(self): |
||||
|
||||
logo = self.files.filter(purpose='logo') |
||||
if logo: |
||||
return logo[0] |
||||
return logo |
||||
|
||||
def get_preview(self): |
||||
|
||||
preview = self.files.filter(purpose='preview') |
||||
if preview: |
||||
return preview[0] |
||||
return preview |
||||
|
||||
def get_photos(self): |
||||
photos = self.files.filter(purpose='photo') |
||||
return photos |
||||
|
||||
def on(self): |
||||
self.is_published = True |
||||
self.canceled_by_administrator = False |
||||
self.save() |
||||
|
||||
def off(self): |
||||
self.is_published = False |
||||
self.canceled_by_administrator = True |
||||
self.save() |
||||
|
||||
def cancel(self): |
||||
self.canceled_by_administrator = True |
||||
|
||||
def get_services(self): |
||||
ids = [item for item, bool in self.services if bool==True] |
||||
return [Service.objects.get(id=id) for id in ids] |
||||
@ -0,0 +1,27 @@ |
||||
from django.utils.translation import get_language |
||||
from hvad.models import TranslationManager |
||||
|
||||
class ExpoManager(TranslationManager): |
||||
def all(self, lang=None): |
||||
if lang: |
||||
return super(ExpoManager, self).language(lang).all().order_by('name') |
||||
else: |
||||
return super(ExpoManager, self).language(get_language()).all().order_by('name') |
||||
|
||||
def safe_get(self, **kwargs): |
||||
model = self.model |
||||
try: |
||||
return model.objects.get(**kwargs) |
||||
except: |
||||
return None |
||||
|
||||
|
||||
def hvad_to_dict(object): |
||||
""" |
||||
|
||||
""" |
||||
value = object.__dict__ |
||||
lang = get_language() |
||||
bad_fields = ['master_id', 'id', 'language_code'] |
||||
value.update({key:value for key, value in object.translations.filter(language_code=lang).values()[0].iteritems() if key not in bad_fields}) |
||||
return value |
||||
@ -0,0 +1,111 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.core.context_processors import csrf |
||||
from django.shortcuts import render_to_response |
||||
from django.http import HttpResponseRedirect, HttpResponse |
||||
from django.contrib.auth.decorators import login_required |
||||
from django.db.models.loading import get_model |
||||
# |
||||
import xlwt |
||||
import xlrd |
||||
# |
||||
from import_forms import ImportEventForm, ImportThemeForm, ImportTagForm, ImportOrganiserForm,\ |
||||
ImportPlaceConferenceForm, ImportPlaceExpositionForm |
||||
from export_forms import ExportEventForm, ExportOrganiserForm, ExportThemeForm, ExportTagForm,\ |
||||
ExportUserForm, ExportCompanyForm, ExportPlaceConferenceForm, ExportPlaceExpositionForm |
||||
from django.views.generic import FormView |
||||
from django.contrib import messages |
||||
|
||||
def xls_to_response(xls, fname): |
||||
response = HttpResponse(mimetype="application/ms-excel") |
||||
response['Content-Disposition'] = 'attachment; filename=%s' % fname |
||||
xls.save(response) |
||||
return response |
||||
|
||||
|
||||
class ImportView(FormView): |
||||
""" |
||||
abstract class |
||||
""" |
||||
template_name = 'import.html' |
||||
|
||||
def form_valid(self, form): |
||||
form.save_file() |
||||
messages.success(self.request, 'Success') |
||||
|
||||
return super(ImportView, self).form_valid(form) |
||||
|
||||
|
||||
class ExportView(FormView): |
||||
""" |
||||
abstract class |
||||
""" |
||||
template_name = 'export.html' |
||||
|
||||
def form_valid(self, form): |
||||
workbook = form.export() |
||||
if workbook: |
||||
f_name = form.get_fname() |
||||
else: |
||||
messages.error(self.request, 'No objects found') |
||||
return HttpResponseRedirect(self.success_url) |
||||
return xls_to_response(workbook, f_name) |
||||
|
||||
class ExportOrganiser(ExportView): |
||||
form_class = ExportOrganiserForm |
||||
success_url = '/admin/export-organiser' |
||||
|
||||
class ExportTheme(ExportView): |
||||
form_class = ExportThemeForm |
||||
success_url = '/admin/export-theme' |
||||
|
||||
class ExportTag(ExportView): |
||||
form_class = ExportTagForm |
||||
success_url = '/admin/export-tag' |
||||
|
||||
class ExportUser(ExportView): |
||||
form_class = ExportUserForm |
||||
success_url = '/admin/export-user' |
||||
|
||||
class ExportCompany(ExportView): |
||||
form_class = ExportCompanyForm |
||||
success_url = '/admin/export-company' |
||||
|
||||
class ExportPlaceConference(ExportView): |
||||
form_class = ExportPlaceConferenceForm |
||||
success_url = '/admin/export-place_conference' |
||||
|
||||
class ExportPlaceExposition(ExportView): |
||||
form_class = ExportPlaceExpositionForm |
||||
success_url = '/admin/export-place_exposition' |
||||
|
||||
|
||||
|
||||
|
||||
class ImportEvent(ImportView): |
||||
form_class = ImportEventForm |
||||
success_url = '/admin/import-event' |
||||
|
||||
class ImportTheme(ImportView): |
||||
form_class = ImportThemeForm |
||||
success_url = '/admin/import-theme' |
||||
|
||||
class ImportTag(ImportView): |
||||
form_class = ImportTagForm |
||||
success_url = '/admin/import-tag' |
||||
|
||||
class ImportOrganiser(ImportView): |
||||
form_class = ImportOrganiserForm |
||||
success_url = '/admin/import-organiser' |
||||
|
||||
class ImportPlaceExposition(ImportView): |
||||
form_class = ImportPlaceExpositionForm |
||||
success_url = '/admin/import-place_exposition' |
||||
|
||||
class ImportPlaceConference(ImportView): |
||||
form_class = ImportPlaceConferenceForm |
||||
success_url = '/admin/import-place_conference' |
||||
|
||||
class ExportEvent(ExportView): |
||||
form_class = ExportEventForm |
||||
template_name = 'export_event.html' |
||||
success_url = '/admin/export-event' |
||||
@ -0,0 +1,25 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, url |
||||
|
||||
from admin import ImportTheme, ImportEvent, ImportOrganiser, ImportTag, ImportPlaceExposition, ImportPlaceConference |
||||
from admin import ExportTheme, ExportEvent, ExportOrganiser, ExportTag, ExportPlaceExposition,\ |
||||
ExportPlaceConference, ExportCompany, ExportUser |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^import-event/$', ImportEvent.as_view()), |
||||
url(r'^import-theme/$', ImportTheme.as_view()), |
||||
url(r'^import-tag/$', ImportTag.as_view()), |
||||
url(r'^import-organiser/$', ImportOrganiser.as_view()), |
||||
url(r'^import-place_exposition/$', ImportPlaceExposition.as_view()), |
||||
url(r'^import-place_conference/$', ImportPlaceConference.as_view()), |
||||
# |
||||
url(r'^export-event/$', ExportEvent.as_view()), |
||||
url(r'^export-theme/$', ExportTheme.as_view()), |
||||
url(r'^export-tag/$', ExportTag.as_view()), |
||||
url(r'^export-organiser/$', ExportOrganiser.as_view()), |
||||
url(r'^export-place_exposition/$', ExportPlaceExposition.as_view()), |
||||
url(r'^export-place_conference/$', ExportPlaceConference.as_view()), |
||||
url(r'^export-user/$', ExportUser.as_view()), |
||||
url(r'^export-company/$', ExportCompany.as_view()), |
||||
) |
||||
|
||||
@ -0,0 +1,237 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from django.conf import settings |
||||
from theme.models import Theme, Tag |
||||
from place_exposition.models import PlaceExposition |
||||
from place_conference.models import PlaceConference |
||||
from country.models import Country |
||||
from organiser.models import Organiser |
||||
from django.db.models.loading import get_model |
||||
import xlrd, xlwt |
||||
from excel_settings import import_settings |
||||
|
||||
languages = [code for code in settings.LANGUAGES] |
||||
|
||||
|
||||
class ImportForm(forms.Form): |
||||
""" |
||||
abstract form for importing models from excel file to database |
||||
""" |
||||
model = None |
||||
excel_file = forms.FileField(label='Выберите файл') |
||||
language = forms.ChoiceField(label='Выберите язык', choices=languages) |
||||
def save_file(self): |
||||
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]] |
||||
|
||||
|
||||
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 |
||||
|
||||
try: |
||||
object = self.model.objects.language(lang).get(id=int(row[0])) |
||||
except ValueError: |
||||
object = self.model() |
||||
object.translate(lang) |
||||
|
||||
except self.model.DoesNotExist: |
||||
object = self.model(id= int(row[0])) |
||||
object.translate(lang) |
||||
else: |
||||
# if id blank - its a new event |
||||
object = self.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] |
||||
if field_name =='theme': |
||||
# need save object before saving manytomany field |
||||
object.save() |
||||
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) |
||||
value = func(cell, lang, getattr(object, extra_value)) |
||||
else: |
||||
value = func(cell) |
||||
|
||||
setattr(object, field_name, value) |
||||
|
||||
object.save() |
||||
|
||||
class ImportOrganiserForm(ImportForm): |
||||
model = Organiser |
||||
|
||||
class ImportThemeForm(ImportForm): |
||||
model = Theme |
||||
|
||||
class ImportPlaceExpositionForm(ImportForm): |
||||
model = PlaceExposition |
||||
|
||||
class ImportPlaceConferenceForm(ImportForm): |
||||
model = PlaceConference |
||||
|
||||
class ImportEventForm(ImportForm): |
||||
""" |
||||
extended form for importing one type of event |
||||
""" |
||||
|
||||
event = forms.ChoiceField(label='Выберите тип события', choices=[('exposition.Exposition', 'Выставка'), |
||||
('conference.Conference', 'Конференция'), |
||||
('seminar.Seminar', 'Семинар'), |
||||
('webinar.Webinar', 'Вебинар')]) |
||||
def save_file(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 |
||||
try: |
||||
object = self.model.objects.language(lang).get(id=int(row[0])) |
||||
except ValueError: |
||||
object = self.model() |
||||
object.translate(lang) |
||||
|
||||
except self.model.DoesNotExist: |
||||
object = self.model(id= int(row[0])) |
||||
object.translate(lang) |
||||
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] |
||||
if field_name =='theme': |
||||
# need save object before saving manytomany field |
||||
object.save() |
||||
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 cell: |
||||
value = func(cell, lang, getattr(object, extra_value)) |
||||
else: |
||||
value = None |
||||
else: |
||||
value = func(cell) |
||||
if value: |
||||
setattr(object, field_name, value) |
||||
|
||||
object.save() |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class ImportTagForm(ImportForm): |
||||
""" |
||||
hacked problem with importing theme field in save_file method |
||||
""" |
||||
model = Tag |
||||
def save_file(self): |
||||
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]] |
||||
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 |
||||
try: |
||||
object = self.model.objects.language(lang).get(id=int(row[0])) |
||||
except ValueError: |
||||
object = self.model() |
||||
object.translate(lang) |
||||
|
||||
except self.model.DoesNotExist: |
||||
object = self.model(id= int(row[0])) |
||||
object.translate(lang) |
||||
else: |
||||
# if id blank - its a new event |
||||
object = self.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) |
||||
value = func(cell, lang, getattr(object, extra_value)) |
||||
else: |
||||
value = func(cell) |
||||
if field_name != 'theme': |
||||
setattr(object, field_name, value) |
||||
else: |
||||
setattr(object, field_name, value[0]) |
||||
|
||||
object.save() |
||||
@ -1,64 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.core.context_processors import csrf |
||||
from django.shortcuts import render_to_response |
||||
from django.http import HttpResponseRedirect, HttpResponse |
||||
from django.contrib.auth.decorators import login_required |
||||
from django.db.models.loading import get_model |
||||
# |
||||
import xlwt |
||||
import xlrd |
||||
# |
||||
from custom_forms import ImportEventForm, ExportEventForm |
||||
from excel_settings import field_settings, import_settings |
||||
|
||||
relation_fields = ['city'] |
||||
@login_required |
||||
def import_event(request): |
||||
args = {} |
||||
form = ImportEventForm() |
||||
args.update(csrf(request)) |
||||
args['form'] = form |
||||
|
||||
if request.POST: |
||||
|
||||
form = ImportEventForm(request.POST, request.FILES) |
||||
if form.is_valid(): |
||||
|
||||
form.save_events() |
||||
|
||||
args['message'] = 'Success' |
||||
return render_to_response('import_event.html', args) |
||||
|
||||
return render_to_response('import_event.html', args) |
||||
|
||||
|
||||
|
||||
def xls_to_response(xls, fname): |
||||
response = HttpResponse(mimetype="application/ms-excel") |
||||
response['Content-Disposition'] = 'attachment; filename=%s' % fname |
||||
xls.save(response) |
||||
return response |
||||
|
||||
|
||||
def export_event(request): |
||||
if request.POST: |
||||
form = ExportEventForm(request.POST) |
||||
if form.is_valid(): |
||||
workbook = form.export_events() |
||||
if workbook is None: |
||||
pass |
||||
else: |
||||
f_name = form.get_fname() |
||||
return xls_to_response(workbook, f_name) |
||||
|
||||
#return xls_to_response(workbook, 'My Worksheet.xls') |
||||
else: |
||||
form = ExportEventForm() |
||||
|
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
|
||||
args['form'] = form |
||||
|
||||
return render_to_response('export_event.html', args) |
||||
|
Before Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 448 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 329 B |
|
Before Width: | Height: | Size: 331 B |
|
Before Width: | Height: | Size: 342 B |
|
Before Width: | Height: | Size: 340 B |
|
Before Width: | Height: | Size: 336 B |
|
Before Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 343 B |
|
Before Width: | Height: | Size: 321 B |
|
Before Width: | Height: | Size: 323 B |
|
Before Width: | Height: | Size: 344 B |
|
Before Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 328 B |
|
Before Width: | Height: | Size: 337 B |
|
Before Width: | Height: | Size: 350 B |
|
Before Width: | Height: | Size: 336 B |
|
Before Width: | Height: | Size: 53 B |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 152 B |
|
Before Width: | Height: | Size: 43 B |
|
Before Width: | Height: | Size: 46 B |
|
Before Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 10 KiB |