create delete view, which check if object has related objects

remotes/origin/1203
Nazar Kotjuk 12 years ago
parent 174b57ee59
commit 466f883d34
  1. 14
      city/forms.py
  2. 6
      city/models.py
  3. 9
      city/urls.py
  4. 7
      city/views.py
  5. 7
      country/forms.py
  6. 9
      country/models.py
  7. 4
      country/urls.py
  8. 39
      country/views.py
  9. 28
      functions/custom_views.py
  10. 3
      templates/admin/city/city_all.html
  11. 3
      templates/admin/country/country_all.html
  12. 20
      templates/delete.html

@ -111,9 +111,10 @@ class CityForm(forms.Form):
def clean(self): def clean(self):
id = self.cleaned_data.get('city_id') id = self.cleaned_data.get('city_id')
name_ru = self.cleaned_data.get('name_ru') name_ru = self.cleaned_data.get('name_ru')
c = City.objects.get(pk=id) country = self.cleaned_data.get('country')
city = City.objects.filter( city = City.objects.filter(
url='%s-%s'%(translit_with_separator(c.country.name), translit_with_separator(name_ru)) url='%s-%s'%(translit_with_separator(country.name), translit_with_separator(name_ru))
) )
if city and str(city[0].id) != id: if city and str(city[0].id) != id:
msg = 'Город с таким названием уже существует' msg = 'Город с таким названием уже существует'
@ -145,4 +146,11 @@ class CityForm(forms.Form):
""" """
cleaned_data = super(CityForm, self).clean() cleaned_data = super(CityForm, self).clean()
population = cleaned_data.get('population').strip() population = cleaned_data.get('population').strip()
return is_positive_integer(population) return is_positive_integer(population)
class CityDeleteForm(forms.ModelForm):
url = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = City
fields = ('url',)

@ -32,10 +32,12 @@ class City(TranslatableModel):
services = BitField(flags=flags) services = BitField(flags=flags)
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
country = models.ForeignKey('country.Country', null=True, on_delete=models.PROTECT) #relations
country = models.ForeignKey('country.Country', null=True, on_delete=models.PROTECT, related_name='cities')
code_IATA = models.ForeignKey(Iata, blank=True, null=True)
population = models.PositiveIntegerField(blank=True, null=True) population = models.PositiveIntegerField(blank=True, null=True)
phone_code = models.PositiveIntegerField(blank=True, null=True) phone_code = models.PositiveIntegerField(blank=True, null=True)
code_IATA = models.ForeignKey(Iata, null=True)
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(max_length=50), name = models.CharField(max_length=50),

@ -1,8 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
urlpatterns = patterns('', urlpatterns = patterns('city.views',
url(r'^add/$', 'city.views.city_add'), url(r'^add/$', 'city_add'),
url(r'^change/(.*)/$', 'city.views.city_change'), url(r'^delete/(?P<url>.*)/$', 'city_delete'),
url(r'^all/$', 'city.views.city_all'), url(r'^change/(.*)/$', 'city_change'),
url(r'^all/$', 'city_all'),
) )

@ -6,12 +6,12 @@ from django.conf import settings
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
#models and forms #models and forms
from forms import CityForm from forms import CityForm, CityDeleteForm
from models import City from models import City
from file.models import FileModel from file.models import FileModel
from file.forms import FileModelForm from file.forms import FileModelForm
#custom views #custom views
from functions.custom_views import objects_list, add_object_with_file from functions.custom_views import objects_list, add_object_with_file, delete_object
def city_all(request): def city_all(request):
@ -28,6 +28,9 @@ def city_add(request):
""" """
return add_object_with_file(request, CityForm, 'city_add.html', '/city/all') return add_object_with_file(request, CityForm, 'city_add.html', '/city/all')
def city_delete(request, url):
return delete_object(request, City, CityDeleteForm, url, '/city/all/')
@login_required @login_required
def city_change(request, url): def city_change(request, url):

@ -225,3 +225,10 @@ class CountryForm(forms.Form):
cleaned_data = super(CountryForm, self).clean() cleaned_data = super(CountryForm, self).clean()
time_delivery = cleaned_data.get('time_delivery').strip() time_delivery = cleaned_data.get('time_delivery').strip()
return is_positive_integer(time_delivery) return is_positive_integer(time_delivery)
class CountryDeleteForm(forms.ModelForm):
url = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Country
fields = ('url',)

@ -31,14 +31,17 @@ class Country(TranslatableModel):
REGIONS =('europa', 'asia', 'america', 'africa') REGIONS =('europa', 'asia', 'america', 'africa')
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
#relations
big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities')
capital = models.ForeignKey(City,blank=True, null=True, on_delete=models.PROTECT, related_name='capital') capital = models.ForeignKey(City,blank=True, null=True, on_delete=models.PROTECT, related_name='capital')
language = models.ManyToManyField(Language, blank=True, null=True)
currency = models.ManyToManyField(Currency, blank=True, null=True)
population = models.PositiveIntegerField(blank=True, null=True) population = models.PositiveIntegerField(blank=True, null=True)
teritory = models.PositiveIntegerField(blank=True, null=True) teritory = models.PositiveIntegerField(blank=True, null=True)
timezone = models.FloatField(blank=True, null=True) timezone = models.FloatField(blank=True, null=True)
phone_code = models.PositiveIntegerField(blank=True, null=True) phone_code = models.PositiveIntegerField(blank=True, null=True)
big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities')
language = models.ManyToManyField(Language, blank=True, null=True)
currency = models.ManyToManyField(Currency, blank=True, null=True)
time_delivery = models.PositiveSmallIntegerField(blank=True, null=True) time_delivery = models.PositiveSmallIntegerField(blank=True, null=True)
# #
region = EnumField(values=REGIONS) region = EnumField(values=REGIONS)

@ -3,7 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('country.views', urlpatterns = patterns('country.views',
url(r'^add.*/$', 'country_add'), url(r'^add.*/$', 'country_add'),
url(r'^delete/(.*)/$', 'country_delete'), url(r'^delete/(?P<url>.*)/$', 'country_delete'),
url(r'^change/(.*)/$', 'country_change'), url(r'^change/(?P<url>.*)/$', 'country_change'),
url(r'^all/$', 'country_all'), url(r'^all/$', 'country_all'),
) )

@ -9,11 +9,14 @@ from django.db.models.loading import get_model
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
#models and forms #models and forms
from models import Country from models import Country
from forms import CountryForm from forms import CountryForm, CountryDeleteForm
from file.models import FileModel, TmpFile from file.models import FileModel, TmpFile
from file.forms import FileModelForm from file.forms import FileModelForm
#custom views #custom views
from functions.custom_views import objects_list, add_object_with_file from functions.custom_views import objects_list, add_object_with_file, delete_object
from django.db.models.deletion import ProtectedError
def country_all(request): def country_all(request):
""" """
@ -28,37 +31,9 @@ def country_add(request):
""" """
return add_object_with_file(request, CountryForm, 'country_add.html', '/country/all/') return add_object_with_file(request, CountryForm, 'country_add.html', '/country/all/')
def country_delete(request, url):
try:
c = Country.objects.get(url=url)
country_id = getattr(c, 'id')
except:
return HttpResponseRedirect('/country/all')
c.delete()
return objects_list(request, Country, 'country_all.html')
def objects_list(request, Model, template, item_per_page=10):
"""
Return template with all objects of model Model
Model - objects Model
item_per_page - how many objects view in the one page
"""
list = Model.objects.all()
paginator = Paginator(list, item_per_page)
page = request.GET.get('page')
try:
objects = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
objects = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
objects = paginator.page(paginator._num_pages)
return render_to_response(template, {'objects': objects})
def country_delete(request, url):
return delete_object(request, Country, CountryDeleteForm, url, '/country/all/')
@login_required @login_required

@ -5,6 +5,7 @@ from django.core.context_processors import csrf
from django.conf import settings from django.conf import settings
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models.deletion import ProtectedError
#forms and models #forms and models
from file.forms import FileModelForm from file.forms import FileModelForm
from file.models import TmpFile from file.models import TmpFile
@ -123,4 +124,29 @@ def add_object_with_file(request, Form, template, redirect_string, choices={}):
#list of files connected to this form #list of files connected to this form
args['files'] = TmpFile.objects.filter(key=key) args['files'] = TmpFile.objects.filter(key=key)
return render_to_response(template, args) return render_to_response(template, args)
@login_required
def delete_object(request, Model, Form, url, prev_page,):
if request.GET:
url = request.GET.get('url')
object = Model.objects.get(url=url)
try:
object.delete()
return HttpResponseRedirect(prev_page)
except ProtectedError:
msg = 'Удаления %s требует удаления связаных объектов'%object
return render_to_response('delete.html', {'msg':msg, 'prev_page':prev_page})
else:
object = Model.objects.get(url=url)
form = Form(instance=object)
args = {}
args.update(csrf(request))
args['form'] = form
args['country'] = object
args['prev_page'] = prev_page
return render_to_response('delete.html', args)

@ -29,6 +29,9 @@ Displays lists of all cities in the table
<a class="btn btn-info" href="/city/change/{{ item.url|lower }}"> <a class="btn btn-info" href="/city/change/{{ item.url|lower }}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
<a class="btn btn-danger delete" href="/city/delete/{{ item.url }}/">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

@ -31,7 +31,7 @@ Displays lists of all countries in the table
<a class="btn btn-info" href="/country/change/{{ item.url|lower }}"> <a class="btn btn-info" href="/country/change/{{ item.url|lower }}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
<a class="btn btn-danger" href="/country/delete/{{ item.url }}"> <a class="btn btn-danger delete" href="/country/delete/{{ item.url }}/">
<i class="icon-trash icon-white"></i> Удалить <i class="icon-trash icon-white"></i> Удалить
</a> </a>
</td> </td>
@ -72,5 +72,6 @@ Displays lists of all countries in the table
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}

@ -0,0 +1,20 @@
{% extends 'base.html' %}
{% block body %}
{% if form %}
<form>
<p>Вы действительно хотите удалить <b>{{ object }}</b>?</p><br>
{{ form.url }}
<input type="submit" class="btn-primary" value="Да">
<a class="btn" href="{{ prev_page }}">Нет</a>
</form>
{% else %}
{{ msg }}
<br>
<a href="{{ prev_page }}">Вернуться</a>
{% endif %}
{% endblock %}
Loading…
Cancel
Save