views.py 22 KB

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