diff --git a/service/admin.py b/service/admin.py index ede3e3c1..47942e10 100644 --- a/service/admin.py +++ b/service/admin.py @@ -165,20 +165,21 @@ class ServiceAddView(FormView): pass from django.shortcuts import get_object_or_404 -from django.views.generic import UpdateView +from django.views.generic import UpdateView, ListView, DeleteView from django.db.models import F -from django.db.models.query import EmptyQuerySet +from django.core.urlresolvers import reverse from .forms import LinkedServiceForm from .models import LinkedService from exposition.models import Exposition from conference.models import Conference -class ServiceUpdateView(UpdateView): + +class LinkedServiceUpdateView(UpdateView): form_class = LinkedServiceForm model = LinkedService template_name = "admin/service/linked_service.html" - success_url = "/admin/service/all/" + success_url = "/admin/service/test/all/" def get_object(self, queryset=None): url = self.kwargs['url'] @@ -187,8 +188,35 @@ class ServiceUpdateView(UpdateView): return obj def get_initial(self): + types = {0:[], 1:['expo'], 2:['conference'], 3:['expo', 'conference']} initial = { - 'expositions':','.join(["%s:%s"%(item.id, item.name) for item in object.expositions.all()]), - 'conferences':','.join(["%s:%s"%(item.id, item.name) for item in self.object.conferences.all()]) + 'expositions': ",".join("%s:%s"%(item.id, item.name) for item in self.object.expositions.all()), + 'conferences': ",".join("%s:%s"%(item.id, item.name) for item in self.object.conferences.all()), + 'type': types[self.object.service.type.mask] } + return initial + + def get_success_url(self): + return self.success_url + def form_valid(self, form): + self.object = form.save() + self.object.update_all_flags() + return HttpResponseRedirect(self.get_success_url()) + +class LinkedServiceList(ListView): + model = LinkedService + template_name = 'admin/service/linked_service_list.html' + + +class LinkedServiceDeleteView(DeleteView): + model = LinkedService + template_name = 'admin/service/linked_service_confirm_delete.html' + success_url = '/admin/service/test/all' + slug_url_kwarg = 'url' + + def get_object(self, queryset=None): + url = self.kwargs['url'] + service = get_object_or_404(Service, url=url) + obj = LinkedService.objects.get(service=service) + return obj diff --git a/service/admin_urls.py b/service/admin_urls.py index c445dac2..f1816405 100644 --- a/service/admin_urls.py +++ b/service/admin_urls.py @@ -2,7 +2,7 @@ from django.conf.urls import patterns, include, url from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \ ParticipationListView, RemoteListView,TicketsListView -from service.admin import ServiceControlList, ServiceControl, ServiceAddView, ServiceUpdateView +from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView urlpatterns = patterns('service.admin', url(r'^control/list/$', ServiceControlList.as_view()), @@ -18,8 +18,10 @@ urlpatterns = patterns('service.admin', url(r'order/participation/$', ParticipationListView.as_view()), url(r'order/remote/$', RemoteListView.as_view()), url(r'order/tickets/$', TicketsListView.as_view()), - url('^test/(?P[a-z]*)/', ServiceUpdateView.as_view()), - url('^test/$', ServiceAddView.as_view()), + url('^test/delete/(?P[a-z]*)/', LinkedServiceDeleteView.as_view(), name='linked_service_delete'), + url('^test/all/', LinkedServiceList.as_view(), name = 'linked_service_all'), + url('^test/(?P[a-z]*)/', LinkedServiceUpdateView.as_view(), name= 'linked_service_update'), + #ajax url(r'^get_city/$', 'get_city'), diff --git a/service/forms.py b/service/forms.py index b62fac7f..b2f88280 100644 --- a/service/forms.py +++ b/service/forms.py @@ -162,25 +162,36 @@ from django.db.models.query import EmptyQuerySet class LinkedServiceForm(forms.ModelForm): - type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple) - + type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False) + expositions = forms.CharField(widget=forms.HiddenInput,required=False) + conferences = forms.CharField(widget=forms.HiddenInput, required=False) + class Meta: model = LinkedService fields = ['countries', 'all_countries', 'expositions', 'conferences'] - widgets={ - 'expositions': forms.HiddenInput, - 'conferences': forms.HiddenInput - } + + def clean_countries(self): + return list(set(self.cleaned_data['countries'])) def clean_expositions(self): expositions = EmptyQuerySet() if self.cleaned_data['expositions']: - expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions']))) + expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions'].split(',')))) return expositions def clean_conferences(self): conferences = EmptyQuerySet() if self.cleaned_data['conferences']: - conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences']))) + conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(',')))) return conferences + def save(self, commit=True): + obj = super(LinkedServiceForm, self).save(commit=True) + data = self.cleaned_data + # manage service type bit field + types = data['type'] + obj.service.type = 0 + for type in types: + obj.service.type = obj.service.type | getattr(Service.type, type) + obj.service.save() + return obj diff --git a/service/management/__init__.py b/service/management/__init__.py new file mode 100644 index 00000000..7ff70582 --- /dev/null +++ b/service/management/__init__.py @@ -0,0 +1 @@ +__author__ = 'dev' diff --git a/service/management/commands/__init__.py b/service/management/commands/__init__.py new file mode 100644 index 00000000..7ff70582 --- /dev/null +++ b/service/management/commands/__init__.py @@ -0,0 +1 @@ +__author__ = 'dev' diff --git a/service/management/commands/create_linked_services.py b/service/management/commands/create_linked_services.py new file mode 100644 index 00000000..b1f27201 --- /dev/null +++ b/service/management/commands/create_linked_services.py @@ -0,0 +1,25 @@ +from django.core.management.base import BaseCommand +from django.utils.translation import activate +from service.models import Service,LinkedService +from country.models import Country +from exposition.models import Exposition +from conference.models import Conference + + +class Command(BaseCommand): + def handle(self, *args, **options): + activate('ru') + LinkedService.objects.all().delete() + services = Service.objects.all() + for service in services: + linked = LinkedService() + linked.service = service + linked.save() + if Country.objects.language().filter(services=getattr(Country.services, service.url)).count() == Country.objects.language().count(): + linked.all_countries = True + else: + linked.countries = Country.objects.language().filter(services=getattr(Country.services, service.url)) + linked.expositions = Exposition.objects.language().filter(services=getattr(Exposition.services, service.url)) + linked.conferences = Conference.objects.language().filter(services=getattr(Conference.services, service.url)) + linked.save() + diff --git a/service/models.py b/service/models.py index c8d7946e..ec774a5e 100644 --- a/service/models.py +++ b/service/models.py @@ -204,6 +204,7 @@ class CallBack(models.Model): from country.models import Country from exposition.models import Exposition from conference.models import Conference +from django.db.models import F class LinkedService(models.Model): @@ -212,3 +213,26 @@ class LinkedService(models.Model): all_countries = models.BooleanField(default=False) expositions = models.ManyToManyField(Exposition, blank=True) conferences = models.ManyToManyField(Conference, blank=True) + + def update_countries_flag(self): + if self.all_countries: + Country.objects.language().update(services=F('services').bitor(getattr(Country.services, self.service.url))) + else: + self.countries.update(services=F('services').bitor(getattr(Country.services, self.service.url))) + Country.objects.exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url))) + + def update_expositions_flag(self): + self.expositions.update(services=F('services').bitor(getattr(Exposition.services, self.service.url))) + Exposition.objects.exclude(id__in=[c.id for c in self.expositions.all()]).update(services=F('services').bitand(~getattr(Exposition.services, self.service.url))) + + def update_conferences_flag(self): + self.conferences.update(services=F('services').bitor(getattr(Conference.services, self.service.url))) + Conference.objects.exclude(id__in=[c.id for c in self.conferences.all()]).update(services=F('services').bitand(~getattr(Conference.services, self.service.url))) + + def update_all_flags(self): + self.update_countries_flag() + self.update_expositions_flag() + self.update_conferences_flag() + + def __unicode__(self): + return u'Linked service for %s'%self.service.url diff --git a/templates/admin/service/linked_service.html b/templates/admin/service/linked_service.html new file mode 100644 index 00000000..9d65bc9c --- /dev/null +++ b/templates/admin/service/linked_service.html @@ -0,0 +1,162 @@ +{% extends 'base.html' %} +{% load static %} + + {% block scripts %} + + {# selects #} + + + + + + + {% endblock %} + +{% block body %} + +{# Uses multilang.html template for translated fields #} +
{% csrf_token %} +{{ form.errors }} +
+ +
+ {{ form.type }}{{ form.type.errors }} +
+
+
+ +
+ {{ form.countries }}{{ form.countries.errors }} +
+
+
+ +
+ {{ form.all_countries }} +
+
+ +
+ +
+ {{ form.expositions }}{{ form.expositions.errors }} +
+
+
+ +
+ {{ form.conferences }}{{ form.conferences.errors }} +
+
+
+
+ + +
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/templates/admin/service/linked_service_confirm_delete.html b/templates/admin/service/linked_service_confirm_delete.html new file mode 100644 index 00000000..21cc73d0 --- /dev/null +++ b/templates/admin/service/linked_service_confirm_delete.html @@ -0,0 +1,11 @@ +{% extends 'base.html' %} +{% block sidebar %}{% endblock %} +{% block body %} +
{% csrf_token %} +
+

Вы точно хотите удалить настройку для сервиса "{{ object.service.name }}" ?

+ + Нет +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/admin/service/linked_service_list.html b/templates/admin/service/linked_service_list.html new file mode 100644 index 00000000..eb4af0cb --- /dev/null +++ b/templates/admin/service/linked_service_list.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% block body %} + +
+
+

Настройки услуг

+
+
+ + + + + + + + + + + + + + {{ object }} + {% for item in object_list %} + + + + + + + + + + {% endfor %} + +
idНазвание услугиТипСтранВиставокКонференций 
{{ item.id }}{{ item.service.name }}{% if item.service.type.mask == 1 %} expo {% elif item.service.type.mask == 2%} conf {% elif item.service.type.mask == 3 %} expo, conf{% endif %}{{ item.countries.count }}{{ item.expositions.count }}{{ item.conferences.count }} + + Изменить + + + Удалить + +
+
+ +
+ +{% endblock %}