views.py 24 KB

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