From e5fd4682f3792336e5c2822a6c800d9d55b51f15 Mon Sep 17 00:00:00 2001 From: Ivan Kovalkovskyi Date: Mon, 5 Oct 2015 16:57:10 +0300 Subject: [PATCH] Linked service improvements --- service/admin.py | 24 +- service/forms.py | 19 +- .../commands/create_linked_services.py | 7 +- service/models.py | 24 +- templates/admin/service/linked_service.html | 303 ++++++++---------- templates/admin/service/test_add.html | 155 --------- 6 files changed, 167 insertions(+), 365 deletions(-) delete mode 100644 templates/admin/service/test_add.html diff --git a/service/admin.py b/service/admin.py index 47942e10..d91251fb 100644 --- a/service/admin.py +++ b/service/admin.py @@ -143,35 +143,13 @@ class ServiceControl(FormMixin, DetailView): context['form'] = self.get_form(self.form_class) return context -from .forms import _ServiceForm -class ServiceAddView(FormView): - form_class = _ServiceForm - template_name = 'admin/service/test_add.html' - success_url = '/' - - def get(self, request, *args, **kwargs): - data = request.GET - form = self.form_class(data) - - if form.is_valid(): - countries = form.cleaned_data['countries'] - types = form.cleaned_data['type'] - expos = form.cleaned_data['expos'] - confs = form.cleaned_data['confs'] - is_all_cnt = form.cleaned_data['all_counties'] - raise - else: - pass from django.shortcuts import get_object_or_404 from django.views.generic import UpdateView, ListView, DeleteView -from django.db.models import F -from django.core.urlresolvers import reverse from .forms import LinkedServiceForm from .models import LinkedService -from exposition.models import Exposition -from conference.models import Conference + diff --git a/service/forms.py b/service/forms.py index b2f88280..fa84b396 100644 --- a/service/forms.py +++ b/service/forms.py @@ -149,14 +149,6 @@ class ServiceControlForm(forms.Form): for item in self.event]) -class _ServiceForm(forms.Form): - type = forms.MultipleChoiceField(choices=[(x, x) for x in Service.type], widget=forms.CheckboxSelectMultiple) - countries = forms.MultipleChoiceField(choices=[(x.id,x.name) for x in Country.objects.language().all()]) - all_counties = forms.BooleanField(widget=forms.CheckboxInput) - expos = forms.CharField(widget=forms.HiddenInput) - confs = forms.CharField(widget=forms.HiddenInput) - - from .models import LinkedService from django.db.models.query import EmptyQuerySet @@ -168,20 +160,23 @@ class LinkedServiceForm(forms.ModelForm): class Meta: model = LinkedService - fields = ['countries', 'all_countries', 'expositions', 'conferences'] + fields = ['countries', 'exclude_countries', 'expositions', 'conferences'] + help_text = { + 'exclude_countries': u'При отсутствии стран этот флаг значит ВСЕ страны!' + } def clean_countries(self): - return list(set(self.cleaned_data['countries'])) + return list(set(self.cleaned_data.get('countries'))) def clean_expositions(self): expositions = EmptyQuerySet() - if self.cleaned_data['expositions']: + if self.cleaned_data.get('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']: + if self.cleaned_data.get('conferences'): conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(',')))) return conferences diff --git a/service/management/commands/create_linked_services.py b/service/management/commands/create_linked_services.py index b1f27201..681d9f46 100644 --- a/service/management/commands/create_linked_services.py +++ b/service/management/commands/create_linked_services.py @@ -15,11 +15,10 @@ class Command(BaseCommand): 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 + if Country.objects.language().filter(services=getattr(Country.services, service.url)).count() > 180: + linked.exclude_countries = True + linked.countries = Country.objects.language().exclude(services=getattr(Country.services, service.url)) 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 ec774a5e..4549f10e 100644 --- a/service/models.py +++ b/service/models.py @@ -209,25 +209,29 @@ from django.db.models import F class LinkedService(models.Model): service = models.ForeignKey(Service, blank=False) - countries = models.ManyToManyField(Country, blank=True) - all_countries = models.BooleanField(default=False) - expositions = models.ManyToManyField(Exposition, blank=True) - conferences = models.ManyToManyField(Conference, blank=True) + countries = models.ManyToManyField(Country, blank=True, verbose_name=u"Страны") + exclude_countries = models.BooleanField(default=False, verbose_name=u"Исключить страны") + expositions = models.ManyToManyField(Exposition, blank=True, verbose_name= u"Выставки") + conferences = models.ManyToManyField(Conference, blank=True, verbose_name=u'Конференции') def update_countries_flag(self): - if self.all_countries: - Country.objects.language().update(services=F('services').bitor(getattr(Country.services, self.service.url))) + if self.exclude_countries: + 'filter all countries except selected and set flag to true' + Country.objects.language().exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitor(getattr(Country.services, self.service.url))) + 'set another flags to false' + Country.objects.language().filter(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url))) else: + 'if not exclude, filter all selected countries and set flag to true' 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))) + 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))) + 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() diff --git a/templates/admin/service/linked_service.html b/templates/admin/service/linked_service.html index 9d65bc9c..3ecb4f54 100644 --- a/templates/admin/service/linked_service.html +++ b/templates/admin/service/linked_service.html @@ -1,162 +1,143 @@ -{% 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 }} -
-
-
-
- - -
-
-
- - +{% extends 'base.html' %} +{% load static %} + +{% block scripts %} + + {# selects #} + + + + + + +{% endblock %} + +{% block body %} + + {# Uses multilang.html template for translated fields #} +
{% csrf_token %} +
+
+

Основная информация

+
+ + {% for f in form %} +
+ +
{{ f }} + {{ f.errors }} +
+
+ {% endfor %} +
+ + +
+
+ +
+ + {% endblock %} \ No newline at end of file diff --git a/templates/admin/service/test_add.html b/templates/admin/service/test_add.html deleted file mode 100644 index 559f655a..00000000 --- a/templates/admin/service/test_add.html +++ /dev/null @@ -1,155 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - - {% block scripts %} - - {# selects #} - - - - - - - {% endblock %} - -{% block body %} - -{# Uses multilang.html template for translated fields #} -
-{{ form.errors }} -
- -
- {{ form.type }} -
-
-
- -
- {{ form.countries }} -
-
-
- -
- {{ form.all_counties }} -
-
- -
- -
- {{ form.expos }} -
-
-
- -
- {{ form.confs }} -
-
-
-
- - -
-
-
- - -{% endblock %} \ No newline at end of file