From c1e4e2c9c6507a44175d661baebfdc1b31cc5871 Mon Sep 17 00:00:00 2001 From: Nazar Kotyuk Date: Wed, 4 Jun 2014 09:28:17 +0300 Subject: [PATCH] service, js for buttons --- accounts/models.py | 1 + .../management/commands/exposition_load.py | 10 +- exposition/urls.py | 9 +- exposition/views.py | 153 ++++++--- functions/custom_views.py | 4 + media/import/.~lock.expositions_ru.xlsx# | 1 - media/import/.~lock.places_ru.xlsx# | 1 - media/import/Places Eng Upd.xlsx | Bin 0 -> 26886 bytes organiser/event_forms.py | 29 ++ organiser/urls.py | 7 + organiser/views.py | 16 + proj/urls.py | 1 + service/forms.py | 11 +- service/models.py | 80 ++++- service/order_forms.py | 198 ++++++++++++ service/views.py | 19 +- settings/templatetags/template_filters.py | 26 +- static/client/css/main.css | 1 + static/client/js/main.js | 40 ++- .../client/includes/calendar_button.html | 15 + templates/client/includes/event_list.html | 15 +- templates/client/includes/event_object.html | 13 +- templates/client/includes/event_steps.html | 6 +- templates/client/includes/header.html | 39 ++- templates/client/includes/visit_button.html | 15 + templates/client/organiser/add_event.html | 305 ++++++++++++++++++ templates/client/service/catalog.html | 80 +++-- templates/client/service/participation.html | 84 ++++- templates/client/service/remotely.html | 75 ++++- templates/client/service/tickets.html | 78 ++++- templates/client/service/tour.html | 126 ++++---- templates/client/service/translator.html | 80 +++-- 32 files changed, 1299 insertions(+), 239 deletions(-) delete mode 100644 media/import/.~lock.expositions_ru.xlsx# delete mode 100644 media/import/.~lock.places_ru.xlsx# create mode 100644 media/import/Places Eng Upd.xlsx create mode 100644 organiser/event_forms.py create mode 100644 organiser/urls.py create mode 100644 organiser/views.py create mode 100644 templates/client/includes/calendar_button.html create mode 100644 templates/client/includes/visit_button.html create mode 100644 templates/client/organiser/add_event.html diff --git a/accounts/models.py b/accounts/models.py index 188748c4..66435c7f 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -82,6 +82,7 @@ class UserManager(BaseUserManager): user.save(using=self._db) return user + def safe_get(self, **kwargs): model = self.model try: diff --git a/exposition/management/commands/exposition_load.py b/exposition/management/commands/exposition_load.py index d96cd9db..515b103c 100644 --- a/exposition/management/commands/exposition_load.py +++ b/exposition/management/commands/exposition_load.py @@ -22,7 +22,7 @@ def to_country(value): try: #query = get_translation_aware_manager(Country) #country = query.filter(name=value)[0] - country = Country.objects.filter(translations__name=value)[0] + country = Country.objects.filter(translations__name=value.strip())[0] return country except IndexError: return None @@ -32,7 +32,7 @@ def to_city(value, lang, country): # get city by name #objects = get_translation_aware_manager(City) # except IndexError if no found - city = City.objects.filter(translations__name=value, country=country)[0] + city = City.objects.filter(translations__name=value.strip(), country=country)[0] return city except IndexError: return None @@ -283,11 +283,12 @@ event_sett = { class Command(BaseCommand): def handle(self, *args, **options): - f = open(settings.MEDIA_ROOT+'/import/expositions_ru.xlsx', 'r') + f = open(settings.MEDIA_ROOT+'/import/Places Eng Upd.xlsx', 'r') 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)] labels = [label for label in row_list[0]] + print(123) @@ -368,12 +369,15 @@ class Command(BaseCommand): if not flag: + object.save() + """ try: print('pre save %s'% str(object)) object.save() except: print('saving error') continue + """ print('post save %s'% str(object)) else: print('bad city') diff --git a/exposition/urls.py b/exposition/urls.py index dfb3eb09..c29a150a 100644 --- a/exposition/urls.py +++ b/exposition/urls.py @@ -3,11 +3,16 @@ from django.conf.urls import patterns, include, url from views import ExpositionView, ExpositionVisitors, ExpositionMembers, ExpositionStatistic, ExpositionPrice,\ ExpositionProgramme, ExpositionSearchView +from views import ExpositionServiceView + + urlpatterns = patterns('', - url(r'expositions/search/', ExpositionSearchView.as_view()), + url(r'expositions/search/', ExpositionSearchView.as_view()), + url(r'expositions/(?P.*)/(?P\d+)/$', ExpositionView.as_view()), url(r'expositions/(?P\d+)/$', ExpositionView.as_view()), # + url(r'expositions/(?P.*)/service/(?P.*)/$', ExpositionServiceView.as_view()), url(r'expositions/(?P.*)/statistic/$', ExpositionStatistic.as_view()), url(r'expositions/(?P.*)/price/$', ExpositionPrice.as_view()), url(r'expositions/(?P.*)/program/$', ExpositionProgramme.as_view()), @@ -18,8 +23,6 @@ urlpatterns = patterns('', url(r'expositions/$', ExpositionView.as_view()), # url(r'exposition-add-calendar/(?P\d+)/$', 'exposition.views.exposition_add_calendar'), - url(r'exposition-remove-calendar/(?P\d+)/$', 'exposition.views.exposition_remove_calendar'), url(r'exposition-visit/(?P\d+)/$', 'exposition.views.exposition_visit'), - url(r'exposition-unvisit/(?P\d+)/$', 'exposition.views.exposition_unvisit'), ) diff --git a/exposition/views.py b/exposition/views.py index 420f25b9..05e479ad 100644 --- a/exposition/views.py +++ b/exposition/views.py @@ -1,20 +1,114 @@ # -*- 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 +from django.contrib import messages #models from models import Exposition -from accounts.models import User -from functions.custom_views import ExpoListView, ExpoMixin, EventDetail -from django.views.generic import ListView, DetailView +from functions.custom_views import ExpoListView, ExpoMixin, EventDetail, single_page_filter +from django.views.generic import ListView, DetailView, FormView from haystack.query import EmptySearchQuerySet from functions.search_forms import ExpositionSearchForm +from service.views import order_forms +from django.shortcuts import get_object_or_404 +from django.http import Http404 # +from service.models import Service +from country.models import Country +from city.models import City +from company.models import Company +from theme.models import Theme, Tag import json from django.utils.translation import ugettext as _ + +class ExpositionServiceView(FormView, ExpoMixin): + params = None + search_form = ExpositionSearchForm + model = Exposition + obj = None + service = None + + + def get_form_class(self): + url = self.kwargs.get('url') + form = order_forms.get(url) + if not form: + raise Http404 + + service = get_object_or_404(Service, url=url) + self.service = service + self.template_name = service.template + 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 + + if param.get('type') == 'city': + city = City.objects.safe_get(url=param.get('url')) + if city: + param['name'] = city.name + + if param.get('type') == 'theme': + theme = Theme.objects.safe_get(url=param.get('url')) + if theme: + param['name'] = theme.name + + if param.get('type') == 'tag': + tag = Tag.objects.safe_get(url=param.get('url')) + if tag: + param['name'] = tag.name + + if param.get('type') == 'year': + param['name'] = param.get('url') + + if param.get('type') == 'month': + monthes = {'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, + 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12} + + param['name'] = param.get('url') + + if param.get('type') == 'member' and self.model != Company: + param['name'] = param.get('url') + company = Company.objects.safe_get(url=param.get('url')) + if company: + param['name'] = company.name + + if param.get('type') == single_page_filter.get(self.model): + try: + self.obj = self.model.objects.get(url=param.get('url')) + + except self.model.DoesNotExist: + raise Http404 + + + param['name'] = self.obj.name + + params.append({'type':'service', 'name':service.name}) + self.params = params + return form + + def get_context_data(self, **kwargs): + context = super(ExpositionServiceView, self).get_context_data(**kwargs) + context['search_form'] = ExpositionSearchForm() + context['search_action'] = '/expositions/search/' + context['event'] = self.obj + context['service'] = self.service + context['filter'] = self.params + return context + + def form_valid(self, form): + form.save() + messages.success(self.request, _(u'Ваш запрос был успешно отправлен')) + return HttpResponseRedirect(self.request.path) + + #def form_invalid(self, form): + # return HttpResponse(form.errors) + + + + class ExpositionSearchView(ListView): paginate_by = 2 template_name = 'exposition/search.html' @@ -145,29 +239,17 @@ def exposition_add_calendar(request, id): if user.is_authenticated(): exp = Exposition.objects.safe_get(id=id) - if exp: + if exp in user.calendar.expositions.all(): + user.calendar.expositions.remove(exp) + args['in'] = False + else: user.calendar.expositions.add(exp) - args['success'] = True - else: - args['not_authorized'] = True + args['in'] = 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): @@ -175,23 +257,20 @@ def exposition_visit(request, id): user = request.user if user.is_authenticated(): exp = Exposition.objects.safe_get(id=id) - if exp: + if user in exp.users.all(): + exp.users.remove(user) + args['in'] = False + else: exp.users.add(user) - args['success'] = True + args['in'] = 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) + exp.users.add(user) + args['success'] = True + """ + else: args['not_authorized'] = True args['success'] = True diff --git a/functions/custom_views.py b/functions/custom_views.py index b11dd4ce..c3a8f53c 100644 --- a/functions/custom_views.py +++ b/functions/custom_views.py @@ -218,6 +218,10 @@ class ExpoMixin(object): single_page_filter = {Exposition:'event', Conference:'event', Seminar:'event', Webinar:'event', Company:'member', User:'visitor', Photoreport: 'photoreport'} + + + + class ExpoListView(ExpoMixin, ListView): """ """ diff --git a/media/import/.~lock.expositions_ru.xlsx# b/media/import/.~lock.expositions_ru.xlsx# deleted file mode 100644 index 1254c366..00000000 --- a/media/import/.~lock.expositions_ru.xlsx# +++ /dev/null @@ -1 +0,0 @@ -kotzilla ,kotzilla,kotzilla-Satellite-L300,27.05.2014 19:59,file:///home/kotzilla/.config/libreoffice/3; \ No newline at end of file diff --git a/media/import/.~lock.places_ru.xlsx# b/media/import/.~lock.places_ru.xlsx# deleted file mode 100644 index e09b85da..00000000 --- a/media/import/.~lock.places_ru.xlsx# +++ /dev/null @@ -1 +0,0 @@ -kotzilla ,kotzilla,kotzilla-Satellite-L300,27.05.2014 19:16,file:///home/kotzilla/.config/libreoffice/3; \ No newline at end of file diff --git a/media/import/Places Eng Upd.xlsx b/media/import/Places Eng Upd.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a632b4980e190ff9bd4615f9a8eb824cca2674e5 GIT binary patch literal 26886 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

+Am5PwniTq|^J^5j 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 ul > li.active > a, .c-select-box .csb-menu .places-list > ul > li.active > label { color: #ff6600; } diff --git a/static/client/js/main.js b/static/client/js/main.js index 53ab39b0..99cf7506 100644 --- a/static/client/js/main.js +++ b/static/client/js/main.js @@ -81,24 +81,58 @@ function addError(inputId, msg){ }); - $('.visit').on('click', function(event){ + $('.visit, .unvisit').on('click', function(event){ event.preventDefault(); + var $this = $(this); var url = $(this).attr('href'); $.get(url, function(data){ if (data.not_authorized){ $.fancybox.open('#pw-login'); } + else{ + if(data.success){ + if(data.in){ + if($this.hasClass('visit')){ + $this.hide(); + $this.siblings('.unvisit').show() + } + } + else{ + if($this.hasClass('unvisit')){ + $this.hide(); + $this.siblings('.visit').show() + } + } + } + } }); }); - $('.addcalendar').on('click', function(event){ + $('.addcalendar, .removecalendar').on('click', function(event){ event.preventDefault(); - var url = $(this).attr('href'); + var $this = $(this); + var url = $this.attr('href'); $.get(url, function(data){ if (data.not_authorized){ $.fancybox.open('#pw-login'); } + else{ + if(data.success){ + if(data.in){ + if($this.hasClass('addcalendar')){ + $this.hide(); + $this.siblings('.removecalendar').show() + } + } + else{ + if($this.hasClass('removecalendar')){ + $this.hide(); + $this.siblings('.addcalendar').show() + } + } + } + } }); }); diff --git a/templates/client/includes/calendar_button.html b/templates/client/includes/calendar_button.html new file mode 100644 index 00000000..7c2bc0b7 --- /dev/null +++ b/templates/client/includes/calendar_button.html @@ -0,0 +1,15 @@ +{% load i18n %} +{% load template_filters %} +{% if user.is_authenticated %} + {% if event|in_calendar:user %} + + {% trans 'из расписание' %} + {% else %} + {% trans 'в расписание' %} + + {% endif %} +{% else %} + {% trans 'в расписание' %} + +{% endif %} + diff --git a/templates/client/includes/event_list.html b/templates/client/includes/event_list.html index ea89e76a..9f8830c7 100644 --- a/templates/client/includes/event_list.html +++ b/templates/client/includes/event_list.html @@ -78,17 +78,10 @@ - - {% if user.is_authenticated %} - {% if obj|in_calendar:user %} - {% trans 'из расписания' %} - {% else %} - {% trans 'в расписание' %} - {% endif %} - {% else %} - {% trans 'в расписание' %} - {% endif %} - + {% with event=obj user=user %} + {% include 'client/includes/calendar_button.html' %} + {% endwith %} + {% trans 'заметка' %} diff --git a/templates/client/includes/event_object.html b/templates/client/includes/event_object.html index a8d8bca4..9c9eb007 100644 --- a/templates/client/includes/event_object.html +++ b/templates/client/includes/event_object.html @@ -69,8 +69,13 @@


- {% trans 'Я планирую посетить' %} - {% trans 'в расписание' %} + {% with event=exposition user=user %} + {% include 'client/includes/visit_button.html' %} + {% endwith %} + + {% with event=exposition user=user %} + {% include 'client/includes/calendar_button.html' %} + {% endwith %} {% trans 'заметка' %}