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):
id = self.cleaned_data.get('city_id')
name_ru = self.cleaned_data.get('name_ru')
c = City.objects.get(pk=id)
country = self.cleaned_data.get('country')
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:
msg = 'Город с таким названием уже существует'
@ -145,4 +146,11 @@ class CityForm(forms.Form):
"""
cleaned_data = super(CityForm, self).clean()
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)
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)
phone_code = models.PositiveIntegerField(blank=True, null=True)
code_IATA = models.ForeignKey(Iata, null=True)
#translated fields
translations = TranslatedFields(
name = models.CharField(max_length=50),

@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, url
urlpatterns = patterns('',
url(r'^add/$', 'city.views.city_add'),
url(r'^change/(.*)/$', 'city.views.city_change'),
url(r'^all/$', 'city.views.city_all'),
urlpatterns = patterns('city.views',
url(r'^add/$', 'city_add'),
url(r'^delete/(?P<url>.*)/$', 'city_delete'),
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.contenttypes.models import ContentType
#models and forms
from forms import CityForm
from forms import CityForm, CityDeleteForm
from models import City
from file.models import FileModel
from file.forms import FileModelForm
#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):
@ -28,6 +28,9 @@ def city_add(request):
"""
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
def city_change(request, url):

@ -225,3 +225,10 @@ class CountryForm(forms.Form):
cleaned_data = super(CountryForm, self).clean()
time_delivery = cleaned_data.get('time_delivery').strip()
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')
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')
language = models.ManyToManyField(Language, blank=True, null=True)
currency = models.ManyToManyField(Currency, blank=True, null=True)
population = models.PositiveIntegerField(blank=True, null=True)
teritory = models.PositiveIntegerField(blank=True, null=True)
timezone = models.FloatField(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)
#
region = EnumField(values=REGIONS)

@ -3,7 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('country.views',
url(r'^add.*/$', 'country_add'),
url(r'^delete/(.*)/$', 'country_delete'),
url(r'^change/(.*)/$', 'country_change'),
url(r'^delete/(?P<url>.*)/$', 'country_delete'),
url(r'^change/(?P<url>.*)/$', 'country_change'),
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
#models and forms
from models import Country
from forms import CountryForm
from forms import CountryForm, CountryDeleteForm
from file.models import FileModel, TmpFile
from file.forms import FileModelForm
#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):
"""
@ -28,37 +31,9 @@ def country_add(request):
"""
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

@ -5,6 +5,7 @@ from django.core.context_processors import csrf
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models.deletion import ProtectedError
#forms and models
from file.forms import FileModelForm
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
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 }}">
<i class="icon-edit icon-white"></i> Изменить
</a>
<a class="btn btn-danger delete" href="/city/delete/{{ item.url }}/">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td>
</tr>
{% endfor %}

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