views.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712
  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('my-products'))
  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. # context['wohnprojekt'] = self.object.wohnprojekt
  115. return context
  116. def post(self, request, *args, **kwargs):
  117. vote = int(request.POST['vote'])
  118. comment = str(request.POST['comment'])
  119. if vote <= 10:
  120. try:
  121. get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk'])
  122. get_vote.vote = vote
  123. get_vote.comment = comment
  124. get_vote.save()
  125. except Vote.DoesNotExist:
  126. get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment)
  127. get_vote.save()
  128. else:
  129. return HttpResponseRedirect(request.path)
  130. return HttpResponseRedirect(reverse('products'))
  131. class VoteView(LoginRequiredMixin, generic.ListView):
  132. model = Product
  133. template_name='marktplatz/voteDetail.html'
  134. def get_context_data(self, **kwargs):
  135. context = super().get_context_data(**kwargs)
  136. context['user'] = User.objects.filter(groups__name='JuryMembers')
  137. return context
  138. class CidView(LoginRequiredMixin, generic.ListView):
  139. model = Product
  140. template_name='marktplatz/votes_cid.html'
  141. def get_context_data(self, **kwargs):
  142. context = super().get_context_data(**kwargs)
  143. return context
  144. def post(self, request, *args, **kwargs):
  145. for pk in request.POST.dict():
  146. if not 'csrfmiddlewaretoken' in pk:
  147. if request.POST[pk] != '' and ('cid' in pk):
  148. now_product = Product.objects.get(pk=pk.split('.')[0])
  149. now_product.class_cid = request.POST[pk]
  150. now_product.save()
  151. if request.POST[pk] != '' and ('sub' in pk):
  152. now_product = Product.objects.get(pk=pk.split('.')[0])
  153. now_product.sumbitted = request.POST[pk]
  154. now_product.save()
  155. return HttpResponseRedirect('')
  156. class AdminView(LoginRequiredMixin, generic.ListView):
  157. model = Product
  158. template_name='marktplatz/admin_panel.html'
  159. def get_context_data(self, **kwargs):
  160. context = super().get_context_data(**kwargs)
  161. return context
  162. def post(self, request, *args, **kwargs):
  163. for pk in request.POST.dict():
  164. print(pk)
  165. print("test")
  166. if not 'csrfmiddlewaretoken' in pk:
  167. if request.POST[pk] != '' and ('public' in pk):
  168. pass
  169. #now_Product = Product.objects.get(pk=pk.split('.')[0])
  170. #now_Product.public = request.POST[pk].checktest
  171. #now_Product.save()
  172. if request.POST[pk] != '' and ('edit' in pk):
  173. pass
  174. #now_Product = Product.objects.get(pk=pk.split('.')[0])
  175. #now_Product.edit = request.POST[pk].checktest
  176. #now_Product.save()
  177. return HttpResponseRedirect('')
  178. class lightboximg(LoginRequiredMixin, TemplateView):
  179. template_name = "marktplatz/importold.html"
  180. def post(self, request):
  181. context = {'faild': ''}
  182. faild = ''
  183. from1 = int(request.POST['from'])
  184. to = int(request.POST['to'])
  185. products = Product.objects.all()
  186. i = 0
  187. for product in products:
  188. i+=1
  189. if (i < from1):
  190. continue
  191. if (i > to):
  192. break
  193. medias = product.media_set.all()
  194. for oldmedia in medias:
  195. if not oldmedia.image_norm:
  196. oldpic = oldmedia.image
  197. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  198. oldmedia.save
  199. return render(request, self.template_name, context)
  200. def get(self, request):
  201. context = {'faild': ''}
  202. faild = ''
  203. context['faild'] = faild
  204. return render(request, self.template_name, context)
  205. class registerView(FormView):
  206. template_name = 'marktplatz/form.html'
  207. #form_class = RegisterForm
  208. def get(self, request):
  209. #form = self.form_class()
  210. context = request.GET.dict()
  211. context['form'] = RegisterForm
  212. context['signUp'] = SignUpForm
  213. return render(request, self.template_name, context)
  214. def post(self, request):
  215. print ( request.POST.dict() )
  216. form = SignUpForm(request.POST)
  217. form_contact = RegisterForm(request.POST)
  218. #
  219. # Filter existing emails
  220. #
  221. qs = Contact.objects.filter( email=form_contact.data['email'] )
  222. if ( qs.count() ):
  223. form_contact.add_error('email', "Email already in use, please reset your password.")
  224. if form.is_valid() and form_contact.is_valid():
  225. print (form.cleaned_data)
  226. print (form_contact.cleaned_data)
  227. contact = form_contact.save(commit=False)
  228. user = form.save()
  229. user.email = contact.email
  230. user.first_name = contact.first_name
  231. user.last_name = contact.last_name
  232. user.set_password(form.cleaned_data.get('password1'))
  233. user.save()
  234. contact.user = user
  235. contact.save()
  236. username = form.cleaned_data.get('username')
  237. raw_password = form.cleaned_data.get('password1')
  238. group = Group.objects.get(name='submission')
  239. group.user_set.add(user)
  240. user = authenticate(username=username, password=raw_password)
  241. if user is not None:
  242. # A backend authenticated the credentials
  243. login(request, user)
  244. return redirect('products')
  245. else:
  246. # No backend authenticated the credentials
  247. send_mail(
  248. 'error with auth',
  249. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  250. 'awards@berta.mediaarchitecture.org',
  251. ['juan@mediaarchitecture.org'],
  252. fail_silently=False,
  253. )
  254. return redirect('products')
  255. login(request, user)
  256. else:
  257. print (form.errors)
  258. print (form_contact.errors)
  259. send_mail(
  260. 'error with auth',
  261. '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),
  262. 'awards@berta.mediaarchitecture.org',
  263. ['juan@mediaarchitecture.org'],
  264. fail_silently=False,
  265. )
  266. context = request.POST.dict()
  267. context['signUp'] = form
  268. context['form'] = form_contact
  269. context['signup_errors'] = form.errors
  270. context['contact_errors'] = form_contact.errors
  271. return render(request, self.template_name, context)
  272. # if form_contact.is_valid():
  273. # contact = form_contact.save(commit=False)
  274. # contact.user = user
  275. # contact.save()
  276. #
  277. # return redirect('products')
  278. context = request.GET.dict()
  279. context['form'] = RegisterForm
  280. context['signUp'] = SignUpForm
  281. return render(request, self.template_name, context)
  282. class NewSubmitView(LoginRequiredMixin, FormView):
  283. use_ajax = True
  284. template_name = 'marktplatz/add.html'
  285. model = Product
  286. def get(self, request,*args, **kwargs):
  287. # form = self.form_class()
  288. context = request.GET.dict()
  289. context['product'] = SubmissionForm
  290. # context['lnks'] = LinkFormSet
  291. # context['lnks_helper'] = FormsetHelper()
  292. context['use_ajax'] = True
  293. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  294. return render(request, self.template_name, context)
  295. def post(self, request):
  296. product_f = SubmissionForm(request.POST, request.FILES)
  297. # lnks_f = LinkFormSet(request.POST)
  298. if product_f.is_valid():
  299. product = product_f.save(commit=False)
  300. product.contact = Contact.objects.get(user = self.request.user)
  301. product.edit=True
  302. product.public = False
  303. product.sumbitted = config.CURRENT_EVENT
  304. product.save()
  305. product_f.save_m2m()
  306. # for lnk in lnks_f:
  307. # if lnk.is_valid():
  308. # lnk_ = lnk.save(commit=False)
  309. # lnk_.product=product
  310. # lnk_.save()
  311. if 'addImage' in request.POST:
  312. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  313. return HttpResponseRedirect(reverse('my-products'))
  314. else:
  315. context = request.POST.dict()
  316. context['product'] = product_f
  317. context['product_errors'] = product_f.errors
  318. # context['lnks'] = lnks_f
  319. # context['lnks_helper'] = FormsetHelper()
  320. context['use_ajax'] = True
  321. return render(request, self.template_name, context)
  322. class uploadView(LoginRequiredMixin, FormView):
  323. use_ajax = True
  324. template_name = 'marktplatz/file_upload.html'
  325. def get(self, request, pk):
  326. user = self.request.user
  327. contact = Contact.objects.get(user=user)
  328. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  329. raise Http404
  330. product = Product.objects.get(pk=pk)
  331. photo = product.media_set.count()
  332. video = product.video_set.count()
  333. context = request.GET.dict()
  334. contact = Contact.objects.get(user=self.request.user)
  335. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  336. context['product'] = product
  337. context['images'] = Media.objects.filter(product=product)
  338. context['video'] = Video.objects.filter(product=product)
  339. context['media'] = MediaForm
  340. context['media_count'] = False
  341. context['video_count'] = False
  342. if photo >= 7:
  343. context['media_count'] = True
  344. if video >= 2:
  345. context['video_count'] = True
  346. context['use_ajax'] = True
  347. context['warning'] = False
  348. return render(request, self.template_name, context)
  349. def post(self, request, pk):
  350. vid1_f = MediaForm(request.POST, request.FILES)
  351. product = Product.objects.get(pk=pk)
  352. i = product.media_set.count()
  353. i += product.video_set.count()
  354. video = product.video_set.count()
  355. photo = product.media_set.count()
  356. context = request.GET.dict()
  357. contact = Contact.objects.get(user=self.request.user)
  358. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  359. context['product'] = product
  360. context['images'] = Media.objects.filter(product=product)
  361. context['video'] = Video.objects.filter(product=product)
  362. context['media'] = MediaForm
  363. context['media_count'] = False
  364. context['video_count'] = False
  365. context['use_ajax'] = True
  366. context['warning'] = False
  367. if vid1_f.is_valid():
  368. image = vid1_f.cleaned_data['image']
  369. name = image.name
  370. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  371. if photo < 7:
  372. vid1 = Media()
  373. vid1.product = product
  374. vid1.filename = name
  375. vid1.copyright = vid1_f.cleaned_data['copyright']
  376. vid1.name_for = vid1_f.cleaned_data['name_for']
  377. vid1.image.save(name, image)
  378. vid1.image_small.save(str(i) + '_small', image)
  379. vid1.image_medium.save(str(i) + '_medium', image)
  380. vid1.image_big.save(str(i) + '_big', image)
  381. vid1.image_norm.save(str(i) + '_norm', image)
  382. vid1.save
  383. photo += 1
  384. else:
  385. context['warning'] = "You can not upload any more photos!"
  386. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  387. if video < 2:
  388. #TODO clean image here!
  389. vid1 = Video()
  390. vid1.product = product
  391. vid1.filename = name
  392. vid1.copyright = vid1_f.cleaned_data['copyright']
  393. vid1.name_for = vid1_f.cleaned_data['name_for']
  394. vid1.image.save(name, image)
  395. vid1.save
  396. video += 1
  397. else:
  398. context['warning'] = "You can not upload any more videos!"
  399. vid1_f.delete_temporary_files()
  400. if photo >= 7:
  401. context['media_count'] = True
  402. if video >= 2:
  403. context['video_count'] = True
  404. return render(request, self.template_name, context)
  405. handle_upload = FileFormUploader()
  406. class EditView(FormView):
  407. template_name = 'marktplatz/add.html'
  408. def get(self, request, pk):
  409. user = self.request.user
  410. contact = Contact.objects.get(user=user)
  411. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  412. raise Http404
  413. context = request.GET.dict()
  414. context['product'] = SubmissionForm(instance=Wohnprojekt.objects.get(pk=pk))
  415. linkFormSet = inlineformset_factory(Product,Link, form=LinkForm, extra=0)
  416. myLinkFormSet = linkFormSet(instance= Product.objects.get(pk=pk) )
  417. context['lnks'] = myLinkFormSet
  418. context['lnks_helper'] = FormsetHelper()
  419. context['use_ajax'] = True
  420. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  421. return render(request, self.template_name, context)
  422. def post(self, request, pk):
  423. product_f = SubmissionForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  424. # credits_f = CreditForm(request.POST,instance = Credit.objects.select_related().get(product=pk))
  425. # description_f = DescriptionForm(request.POST,instance = Description.objects.select_related().get(product=pk))
  426. # lnks_f = LinkFormSet(request.POST,instance = Wohnprojekt.objects.get(pk=pk) )
  427. # interaction_f = InteractionForm(request.POST,instance = Interaction.objects.select_related().get(product=pk))
  428. vid1_f = VideoForm(request.POST, request.FILES)
  429. if product_f.is_valid():
  430. if product_f.has_changed():
  431. product_f.save()
  432. product = product_f.save()
  433. # for lnk in lnks_f:
  434. # if lnk.is_valid():
  435. # print( "link valid ......................." )
  436. # lnk_ = lnk.save(commit=False)
  437. # lnk_.product = product
  438. # lnk_.save()
  439. if 'addImage' in request.POST:
  440. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  441. return HttpResponseRedirect(reverse('my-products'))
  442. else:
  443. print( "not saved xxxxxxx" )
  444. context = request.GET.dict()
  445. context['product'] = product_f
  446. context['product_errors'] = product_f.errors
  447. # context['lnks'] = lnks_f
  448. # context['lnks_helper'] = FormsetHelper()
  449. context['use_ajax'] = True
  450. return render(request, self.template_name, context)
  451. class UsersProducts(LoginRequiredMixin, generic.ListView):
  452. model = Product
  453. template_name='marktplatz/myProducts.html'
  454. def get_queryset(self):
  455. contact = Contact.objects.get(user=self.request.user)
  456. return Product.objects.filter(contact=contact)
  457. def get_context_data(self, **kwargs):
  458. context = super().get_context_data(**kwargs)
  459. contact = Contact.objects.get(user=self.request.user)
  460. context['user'] = self.request.user
  461. return context
  462. class MediaView(LoginRequiredMixin, TemplateView):
  463. template_name = 'marktplatz/media_overview.html'
  464. def get(self, request, pk):
  465. self.user = self.request.user
  466. user= self.user
  467. contact = Contact.objects.get(user=user)
  468. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  469. raise Http404
  470. context = request.GET.dict()
  471. contact = Contact.objects.get(user=self.request.user)
  472. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  473. context['product'] = product
  474. context['media'] = Media.objects.filter(product=product)
  475. context['video'] = Video.objects.filter(product=product)
  476. return render(request, self.template_name, context)
  477. def delete_media(request, pk):
  478. user = request.user
  479. contact = Contact.objects.get(user=user)
  480. object = Media.objects.get(id=pk)
  481. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  482. raise Http404
  483. object.delete()
  484. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  485. def delete_video(request, pk):
  486. user = request.user
  487. contact = Contact.objects.get(user=user)
  488. object = Video.objects.get(id=pk)
  489. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  490. raise Http404
  491. object.delete()
  492. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  493. #class datetimeadd(LoginRequiredMixin, TemplateView):
  494. #
  495. # template_name = "marktplatz/importold.html"
  496. #
  497. # def post(self, request):
  498. # context = {'faild': ''}
  499. # faild = ''
  500. # from1 = int(request.POST['from'])
  501. # to = int(request.POST['to'])
  502. #
  503. # Products = Product.objects.all()
  504. # i = 0
  505. #
  506. # for Product in Products:
  507. # i += 1
  508. # if (i < from1):
  509. # continue
  510. # if (i > to):
  511. # break
  512. #
  513. # if Product.date_submitted >
  514. #
  515. # return render(request, self.template_name, context)
  516. #
  517. # def get(self, request):
  518. # context = {'faild': ''}
  519. # faild = ''
  520. # context['faild'] = faild
  521. #
  522. # return render(request, self.template_name, context)