views.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. import csv
  2. import json
  3. import copy
  4. import itertools
  5. from PIL import Image
  6. from PIL import Image
  7. from PIL import ImageFont
  8. from PIL import ImageDraw
  9. from django.db import models
  10. from django.db.models import Count
  11. from django.core import serializers
  12. from django.core.files import File
  13. from django.core.mail import send_mail
  14. from django.urls import reverse, reverse_lazy
  15. from django.http import HttpResponseRedirect, Http404, HttpResponse
  16. from django.contrib import messages
  17. from django.contrib.auth import login, authenticate
  18. from django.contrib.auth.models import User
  19. from django.contrib.auth.mixins import LoginRequiredMixin
  20. from django.contrib.auth.decorators import login_required
  21. from django.contrib.auth.models import User, Group
  22. from django.views import generic
  23. from django.views.generic import TemplateView
  24. from django.views.generic import FormView
  25. from django.views.generic.edit import *
  26. from django.shortcuts import render, get_object_or_404, redirect, get_list_or_404, get_object_or_404
  27. from django.forms import formset_factory
  28. from django.forms import BaseModelFormSet
  29. from django.forms import modelformset_factory, inlineformset_factory
  30. from django.forms.models import model_to_dict
  31. from django_file_form.uploader import FileFormUploader
  32. from django_countries import countries
  33. from django.template import Context, Template
  34. from django.conf import settings
  35. from constance import config
  36. from django.db.models import Q
  37. # from .forms import LinkFormSet, LinkForm, FormsetHelper, MediaFormsetHelper, MediaFormSet
  38. from marktplatz.models import *
  39. from .forms import *
  40. # Create your views here.
  41. def index(request):
  42. context = {}
  43. return render(request, 'index.html', context = context)
  44. def about(request):
  45. context = {}
  46. context = {'about_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  47. return render(request, 'marktplatz/about.html', context)
  48. #template = Template( config.ABOUT_CONTENT )
  49. #return HttpResponse( template.render( Context(context) ) )
  50. #return render(request, rendered , context = context)
  51. def submit(request):
  52. context = {}
  53. context = {'submit_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  54. return render(request,'marktplatz/submit.html', context)
  55. def error_404_view(request, exception):
  56. data = {"name": "ThePythonDjango.com"}
  57. return render(request,'marktplatz/error_404.html', data)
  58. @login_required
  59. def home(request):
  60. user = request.user
  61. if user.groups.filter(name='submission').exists():
  62. return HttpResponseRedirect(reverse('my-products'))
  63. else:
  64. return HttpResponseRedirect(reverse('products'))
  65. class genericView(TemplateView):
  66. template_name = 'marktplatz/generic.html'
  67. def get(self, request, *args, **kwargs):
  68. instance = get_object_or_404(Wohnprojekt, pk=2 )
  69. context = {}
  70. context['object'] = model_to_dict ( instance )
  71. context['object']['myfield'] = '----------------------------'
  72. print (context)
  73. return render(request, self.template_name, context )
  74. class SearchAgentCreate(CreateView):
  75. model = SearchAgent
  76. template_name = 'marktplatz/form.html'
  77. fields = 'ort', 'email'
  78. success_url = reverse_lazy('generic')
  79. embed = False
  80. def get_context_data(self, **kwargs):
  81. if self.embed :
  82. kwargs['embed'] = True
  83. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  84. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  85. return super().get_context_data(**kwargs)
  86. def form_valid(self, form):
  87. super().form_valid(form)
  88. return render(self.request, 'marktplatz/generic.html',
  89. self.get_context_data(form=form))
  90. class SearchAgentDelete(DeleteView):
  91. model = SearchAgent
  92. template_name = 'marktplatz/form.html'
  93. success_url = reverse_lazy('products')
  94. def get(self, request, *args, **kwargs):
  95. searchagent = get_object_or_404(SearchAgent, pk= kwargs.get('pk') )
  96. context = {}
  97. context['form_content'] = 'Dein Suchagent wurde gelöscht!'
  98. if searchagent.hash == kwargs.get('hash'):
  99. if settings.DEBUG:
  100. return render(request, self.template_name, context )
  101. else:
  102. super().get(self, request, *args, **kwargs)
  103. else:
  104. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  105. return render(request, self.template_name, context )
  106. class ProductsView(generic.ListView):
  107. model = Wohnprojekt
  108. #context_object_name = 'Products'
  109. # show the best 4 website finish
  110. def get_queryset(self):
  111. # original qs
  112. qs = super().get_queryset()
  113. self.user = self.request.user
  114. user = self.user
  115. # if user.groups.filter(name='jury').exists():
  116. # return qs.filter(sumbitted = config.CURRENT_EVENT)
  117. qs = qs.order_by('frei')
  118. if user.groups.filter(name='submission').exists():
  119. contact = Contact.objects.get(user=user)
  120. return qs.filter(contact = contact)
  121. if user.is_superuser:
  122. return qs
  123. return qs.filter(public = True)
  124. def get_context_data(self, **kwargs):
  125. context = super().get_context_data(**kwargs)
  126. user =self.request.user
  127. context['user'] = user
  128. used_countries = []
  129. orts = {}
  130. years = {''}
  131. for product in context['wohnprojekt_list']:
  132. if not years.__contains__(product.year):
  133. years.add(product.year)
  134. for country in product.country:
  135. if not used_countries.__contains__(country):
  136. used_countries.append(country)
  137. # if not used_orts.__contains__( product.get_ort_display() ):
  138. if not product.ort in orts:
  139. orts[product.ort] = product.get_ort_display()
  140. years.remove('')
  141. context['year_list'] = years
  142. context['count_list'] = used_countries
  143. context['frei_list'] = Product.FREI
  144. context['status_list'] = Product.STATUS
  145. context['ort_dict'] = orts
  146. context['altneu_list'] = Wohnprojekt.ALTNEU
  147. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  148. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  149. context['textSearchForm'] = textSearchForm()
  150. return context
  151. template_name = 'marktplatz/product_overview.html'
  152. class SearchProductsView(ProductsView):
  153. def get_queryset(self, qfilter, **kwargs ):
  154. # original qs
  155. qs = super().get_queryset()
  156. self.user = self.request.user
  157. user = self.user
  158. qs = qs.filter (name__icontains= qfilter) | qs.filter (claim__icontains= qfilter) | qs.filter (beschreibung__icontains= qfilter) | qs.filter (learning__icontains= qfilter) | qs.filter (status__icontains= qfilter) | qs.filter (adresse__icontains= qfilter) | qs.filter (plz__icontains= qfilter) | qs.filter (adresse__icontains= qfilter) | qs.filter (ort__icontains= qfilter) | qs.filter (website__icontains= qfilter) | qs.filter (email__icontains= qfilter) | qs.filter (kfrei__icontains= qfilter) | qs.filter (rechtsform__icontains= qfilter) | qs.filter (orga__icontains= qfilter)
  159. qs = qs.order_by('frei')
  160. return qs.filter(public = True)
  161. def post(self, request, *args, **kwargs):
  162. qform = textSearchForm( request.POST )
  163. if qform.is_valid():
  164. self.object_list = self.get_queryset(qfilter= qform.cleaned_data["searchText"] )
  165. allow_empty = self.get_allow_empty()
  166. if not allow_empty:
  167. # When pagination is enabled and object_list is a queryset,
  168. # it's better to do a cheap query than to load the unpaginated
  169. # queryset in memory.
  170. if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  171. is_empty = not self.object_list.exists()
  172. else:
  173. is_empty = not self.object_list
  174. if is_empty:
  175. raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  176. 'class_name': self.__class__.__name__,
  177. })
  178. context = self.get_context_data()
  179. return self.render_to_response(context)
  180. class DetailView(generic.DetailView):
  181. model = Product
  182. template_name = 'marktplatz/product_detail.html'
  183. embed = False
  184. def get_context_data(self, **kwargs):
  185. # context = super().get_context_data(**kwargs)
  186. if self.embed :
  187. kwargs['embed'] = True
  188. # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk'])
  189. # context['wohnprojekt'] = self.object.wohnprojekt
  190. return super().get_context_data(**kwargs)
  191. def post(self, request, *args, **kwargs):
  192. vote = int(request.POST['vote'])
  193. comment = str(request.POST['comment'])
  194. if vote <= 10:
  195. try:
  196. get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk'])
  197. get_vote.vote = vote
  198. get_vote.comment = comment
  199. get_vote.save()
  200. except Vote.DoesNotExist:
  201. get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment)
  202. get_vote.save()
  203. else:
  204. return HttpResponseRedirect(request.path)
  205. return HttpResponseRedirect(reverse('products'))
  206. class AdminView(LoginRequiredMixin, generic.ListView):
  207. model = Product
  208. template_name='marktplatz/admin_panel.html'
  209. def get_context_data(self, **kwargs):
  210. context = super().get_context_data(**kwargs)
  211. return context
  212. def post(self, request, *args, **kwargs):
  213. # print (request.POST.dict())
  214. context = request.POST.dict()
  215. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  216. for elemk in public:
  217. # print(elemk + " - " + public[elemk] )
  218. keys = elemk.split(".")
  219. current_product = Product.objects.get(pk=keys[1])
  220. if public[elemk] == 'true':
  221. current_product.public = True
  222. current_product.save()
  223. else:
  224. current_product.public = False
  225. current_product.save()
  226. edit = {k: v for k, v in context.items() if k.startswith('product_e')}
  227. # print (edit)
  228. for elemk in edit:
  229. # print(elemk + " - " + edit[elemk] )
  230. keys = elemk.split(".")
  231. current_product = Product.objects.get(pk=keys[1])
  232. if edit[elemk] == 'true':
  233. current_product.edit = True
  234. current_product.save()
  235. else:
  236. current_product.edit = False
  237. current_product.save()
  238. return HttpResponseRedirect('')
  239. class lightboximg(LoginRequiredMixin, TemplateView):
  240. template_name = "marktplatz/importold.html"
  241. def post(self, request):
  242. context = {'faild': ''}
  243. faild = ''
  244. from1 = int(request.POST['from'])
  245. to = int(request.POST['to'])
  246. products = Product.objects.all()
  247. i = 0
  248. for product in products:
  249. i+=1
  250. if (i < from1):
  251. continue
  252. if (i > to):
  253. break
  254. medias = product.media_set.all()
  255. for oldmedia in medias:
  256. if not oldmedia.image_norm:
  257. oldpic = oldmedia.image
  258. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  259. oldmedia.save
  260. return render(request, self.template_name, context)
  261. def get(self, request):
  262. context = {'faild': ''}
  263. faild = ''
  264. context['faild'] = faild
  265. return render(request, self.template_name, context)
  266. class registerView(FormView):
  267. template_name = 'marktplatz/form.html'
  268. #form_class = RegisterForm
  269. def get(self, request):
  270. #form = self.form_class()
  271. context = request.GET.dict()
  272. context['form'] = RegisterForm
  273. context['signUp'] = SignUpForm
  274. return render(request, self.template_name, context)
  275. def post(self, request):
  276. # print ( request.POST.dict() )
  277. form = SignUpForm(request.POST)
  278. form_contact = RegisterForm(request.POST)
  279. #
  280. # Filter existing emails
  281. #
  282. qs = Contact.objects.filter( email=form_contact.data['email'] )
  283. if ( qs.count() ):
  284. form_contact.add_error('email', "Email already in use, please reset your password.")
  285. if form.is_valid() and form_contact.is_valid():
  286. print (form.cleaned_data)
  287. print (form_contact.cleaned_data)
  288. contact = form_contact.save(commit=False)
  289. user = form.save()
  290. user.email = contact.email
  291. user.first_name = contact.first_name
  292. user.last_name = contact.last_name
  293. user.set_password(form.cleaned_data.get('password1'))
  294. user.save()
  295. contact.user = user
  296. contact.save()
  297. username = form.cleaned_data.get('username')
  298. raw_password = form.cleaned_data.get('password1')
  299. group = Group.objects.get(name='submission')
  300. group.user_set.add(user)
  301. user = authenticate(username=username, password=raw_password)
  302. if user is not None:
  303. # A backend authenticated the credentials
  304. login(request, user)
  305. return redirect('products')
  306. else:
  307. # No backend authenticated the credentials
  308. send_mail(
  309. 'error with auth',
  310. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  311. 'awards@berta.mediaarchitecture.org',
  312. ['juan@mediaarchitecture.org'],
  313. fail_silently=False,
  314. )
  315. return redirect('products')
  316. login(request, user)
  317. else:
  318. print (form.errors)
  319. print (form_contact.errors)
  320. send_mail(
  321. 'error with auth',
  322. 'Error in forms. \n\n form.errors: \n\n' + json.dumps(form.errors) + '\n\n form_contact.errors: \n\n' + json.dumps(form_contact.errors),
  323. 'awards@berta.mediaarchitecture.org',
  324. ['juan@mediaarchitecture.org'],
  325. fail_silently=False,
  326. )
  327. context = request.POST.dict()
  328. context['signUp'] = form
  329. context['form'] = form_contact
  330. context['signup_errors'] = form.errors
  331. context['contact_errors'] = form_contact.errors
  332. return render(request, self.template_name, context)
  333. context = request.GET.dict()
  334. context['form'] = RegisterForm
  335. context['signUp'] = SignUpForm
  336. return render(request, self.template_name, context)
  337. class NewProductView(LoginRequiredMixin, FormView):
  338. use_ajax = True
  339. template_name = 'marktplatz/add.html'
  340. model = Product
  341. class NewWohnprojektView(LoginRequiredMixin, FormView):
  342. use_ajax = True
  343. template_name = 'marktplatz/add.html'
  344. model = Product
  345. def get(self, request,*args, **kwargs):
  346. # form = self.form_class()
  347. context = request.GET.dict()
  348. context['product'] = WohnprojektForm
  349. # context['lnks'] = LinkFormSet
  350. # context['lnks_helper'] = FormsetHelper()
  351. context['use_ajax'] = True
  352. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  353. return render(request, self.template_name, context)
  354. def post(self, request):
  355. product_f = WohnprojektForm(request.POST, request.FILES)
  356. if product_f.is_valid():
  357. product = product_f.save(commit=False)
  358. product.contact = Contact.objects.get(user = self.request.user)
  359. product.edit=True
  360. product.public = False
  361. product.sumbitted = config.CURRENT_EVENT
  362. product.save()
  363. # product_f.save_m2m()
  364. if 'addImage' in request.POST:
  365. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  366. return HttpResponseRedirect(reverse('my-products'))
  367. else:
  368. context = request.POST.dict()
  369. context['product'] = product_f
  370. context['product_errors'] = product_f.errors
  371. context['use_ajax'] = True
  372. return render(request, self.template_name, context)
  373. class uploadView(LoginRequiredMixin, FormView):
  374. use_ajax = True
  375. template_name = 'marktplatz/file_upload.html'
  376. def get(self, request, pk):
  377. user = self.request.user
  378. contact = Contact.objects.get(user=user)
  379. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  380. raise Http404
  381. product = Product.objects.get(pk=pk)
  382. photo = product.media_set.count()
  383. video = product.video_set.count()
  384. context = request.GET.dict()
  385. contact = Contact.objects.get(user=self.request.user)
  386. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  387. context['product'] = product
  388. context['images'] = Media.objects.filter(product=product)
  389. context['video'] = Video.objects.filter(product=product)
  390. context['media'] = MediaForm
  391. context['media_count'] = False
  392. context['video_count'] = False
  393. if photo >= 7:
  394. context['media_count'] = True
  395. if video >= 2:
  396. context['video_count'] = True
  397. context['use_ajax'] = True
  398. context['warning'] = False
  399. return render(request, self.template_name, context)
  400. def post(self, request, pk):
  401. vid1_f = MediaForm(request.POST, request.FILES)
  402. product = Product.objects.get(pk=pk)
  403. i = product.media_set.count()
  404. i += product.video_set.count()
  405. video = product.video_set.count()
  406. photo = product.media_set.count()
  407. context = request.GET.dict()
  408. contact = Contact.objects.get(user=self.request.user)
  409. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  410. context['product'] = product
  411. context['images'] = Media.objects.filter(product=product)
  412. context['video'] = Video.objects.filter(product=product)
  413. context['media'] = MediaForm
  414. context['media_count'] = False
  415. context['video_count'] = False
  416. context['use_ajax'] = True
  417. context['warning'] = False
  418. if vid1_f.is_valid():
  419. image = vid1_f.cleaned_data['image']
  420. name = image.name
  421. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  422. if photo < 7:
  423. vid1 = Media()
  424. vid1.product = product
  425. vid1.filename = name
  426. vid1.copyright = vid1_f.cleaned_data['copyright']
  427. vid1.name_for = vid1_f.cleaned_data['name_for']
  428. vid1.image.save(name, image)
  429. vid1.image_small.save(str(i) + '_small', image)
  430. vid1.image_medium.save(str(i) + '_medium', image)
  431. vid1.image_big.save(str(i) + '_big', image)
  432. vid1.image_norm.save(str(i) + '_norm', image)
  433. vid1.save
  434. photo += 1
  435. else:
  436. context['warning'] = "You can not upload any more photos!"
  437. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  438. if video < 2:
  439. #TODO clean image here!
  440. vid1 = Video()
  441. vid1.product = product
  442. vid1.filename = name
  443. vid1.copyright = vid1_f.cleaned_data['copyright']
  444. vid1.name_for = vid1_f.cleaned_data['name_for']
  445. vid1.image.save(name, image)
  446. vid1.save
  447. video += 1
  448. else:
  449. context['warning'] = "You can not upload any more videos!"
  450. vid1_f.delete_temporary_files()
  451. if photo >= 7:
  452. context['media_count'] = True
  453. if video >= 2:
  454. context['video_count'] = True
  455. return render(request, self.template_name, context)
  456. handle_upload = FileFormUploader()
  457. class EditView(LoginRequiredMixin, FormView):
  458. template_name = 'marktplatz/add.html'
  459. def get(self, request, pk):
  460. user = self.request.user
  461. contact = Contact.objects.get(user=user)
  462. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  463. raise Http404
  464. context = request.GET.dict()
  465. context['product'] = WohnprojektForm(instance=Wohnprojekt.objects.get(pk=pk))
  466. # linkFormSet = inlineformset_factory(Product,Link, form=LinkForm, extra=0)
  467. # myLinkFormSet = linkFormSet(instance= Product.objects.get(pk=pk) )
  468. # context['lnks'] = myLinkFormSet
  469. # context['lnks_helper'] = FormsetHelper()
  470. context['use_ajax'] = True
  471. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  472. return render(request, self.template_name, context)
  473. def post(self, request, pk):
  474. # print ( request.POST.dict() )
  475. # https://stackoverflow.com/questions/35879101/how-to-determine-if-a-field-has-changed-in-a-django-modelform/43550210
  476. # print ('product_f.changed_data: ', product_f.changed_data)
  477. product_f = WohnprojektForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  478. if product_f.is_valid():
  479. if product_f.has_changed():
  480. product = product_f.save( commit=False )
  481. update_fields = product_f.changed_data
  482. product.current_uri = request.build_absolute_uri( '/' ).rstrip('/')
  483. product.save( update_fields=update_fields )
  484. if 'addImage' in request.POST:
  485. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  486. return HttpResponseRedirect(reverse('my-products'))
  487. else:
  488. print( "not saved xxxxxxx" )
  489. context = request.GET.dict()
  490. context['product'] = product_f
  491. context['product_errors'] = product_f.errors
  492. # context['lnks'] = lnks_f
  493. # context['lnks_helper'] = FormsetHelper()
  494. context['use_ajax'] = True
  495. return render(request, self.template_name, context)
  496. class UsersProducts(LoginRequiredMixin, generic.ListView):
  497. model = Product
  498. template_name='marktplatz/myProducts.html'
  499. def get_queryset(self):
  500. contact = Contact.objects.get(user=self.request.user)
  501. return Product.objects.filter(contact=contact)
  502. def get_context_data(self, **kwargs):
  503. context = super().get_context_data(**kwargs)
  504. contact = Contact.objects.get(user=self.request.user)
  505. context['user'] = self.request.user
  506. return context
  507. class MediaView(LoginRequiredMixin, TemplateView):
  508. template_name = 'marktplatz/media_overview.html'
  509. def get(self, request, pk):
  510. self.user = self.request.user
  511. user= self.user
  512. contact = Contact.objects.get(user=user)
  513. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  514. raise Http404
  515. context = request.GET.dict()
  516. contact = Contact.objects.get(user=self.request.user)
  517. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  518. context['product'] = product
  519. context['media'] = Media.objects.filter(product=product)
  520. context['video'] = Video.objects.filter(product=product)
  521. return render(request, self.template_name, context)
  522. def delete_media(request, pk):
  523. user = request.user
  524. contact = Contact.objects.get(user=user)
  525. object = Media.objects.get(id=pk)
  526. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  527. raise Http404
  528. object.delete()
  529. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  530. def delete_video(request, pk):
  531. user = request.user
  532. contact = Contact.objects.get(user=user)
  533. object = Video.objects.get(id=pk)
  534. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  535. raise Http404
  536. object.delete()
  537. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))