views.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  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.contrib.auth import login, authenticate
  19. from django.shortcuts import render, redirect
  20. from django.forms import formset_factory
  21. from django.forms import BaseModelFormSet
  22. from django.forms import modelformset_factory, inlineformset_factory
  23. from .forms import LinkFormSet, LinkForm, FormsetHelper, MediaFormsetHelper, MediaFormSet
  24. from django.contrib import messages
  25. from django_file_form.uploader import FileFormUploader
  26. from django_countries import countries
  27. from django.template import Context, Template
  28. from django.conf import settings
  29. from constance import config
  30. from django.http import Http404
  31. from django.db.models import Count
  32. from PIL import Image
  33. from PIL import ImageFont
  34. from PIL import ImageDraw
  35. from django.db.models import Q
  36. from django.shortcuts import get_list_or_404, get_object_or_404
  37. from .forms import RegisterForm, SignUpForm, DescriptionForm,SubmissionForm,CreditForm,DescriptionForm,InteractionForm,LinkForm,MediaForm,VideoForm, MediaForm_test, MediaForm1, MediaForm2
  38. import os
  39. import itertools
  40. from PIL import Image
  41. import json
  42. import copy
  43. import csv
  44. # Create your views here.
  45. def index(request):
  46. context = {}
  47. return render(request, 'index.html', context = context)
  48. def about(request):
  49. context = {}
  50. context = {'about_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  51. return render(request, 'marktplatz/about.html', context)
  52. #template = Template( config.ABOUT_CONTENT )
  53. #return HttpResponse( template.render( Context(context) ) )
  54. #return render(request, rendered , context = context)
  55. def submit(request):
  56. context = {}
  57. context = {'submit_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  58. return render(request,'marktplatz/submit.html', context)
  59. def error_404_view(request, exception):
  60. data = {"name": "ThePythonDjango.com"}
  61. return render(request,'marktplatz/error_404.html', data)
  62. @login_required
  63. def home(request):
  64. user = request.user
  65. if user.groups.filter(name='submission').exists():
  66. return HttpResponseRedirect(reverse('my-products'))
  67. else:
  68. return HttpResponseRedirect(reverse('products'))
  69. class SearchAgentCreate(CreateView):
  70. model = SearchAgent
  71. template_name = 'marktplatz/form.html'
  72. fields = 'ort', 'email'
  73. success_url = reverse_lazy('products')
  74. class ProductsView(generic.ListView):
  75. model = Product
  76. #context_object_name = 'Products'
  77. # show the best 4 website finish
  78. def get_queryset(self):
  79. # original qs
  80. qs = super().get_queryset()
  81. self.user = self.request.user
  82. user = self.user
  83. if user.groups.filter(name='jury').exists():
  84. return qs.filter(sumbitted = config.CURRENT_EVENT)
  85. if user.groups.filter(name='submission').exists():
  86. contact = Contact.objects.get(user=user)
  87. return qs.filter(contact = contact)
  88. if user.is_superuser:
  89. return qs
  90. return qs.filter(public = True)
  91. def get_context_data(self, **kwargs):
  92. context = super().get_context_data(**kwargs)
  93. user =self.request.user
  94. context['user'] = user
  95. used_countries = []
  96. years = {''}
  97. for product in context['product_list']:
  98. if not years.__contains__(product.year):
  99. years.add(product.year)
  100. for country in product.country:
  101. if not used_countries.__contains__(country):
  102. used_countries.append(country)
  103. years.remove('')
  104. context['year_list'] = years
  105. context['count_list'] = used_countries
  106. context['cat_list'] = Category.objects.all
  107. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  108. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  109. return context
  110. template_name = 'marktplatz/product_overview.html'
  111. class DetailView(generic.DetailView):
  112. model = Product
  113. template_name = 'marktplatz/product_detail.html'
  114. embed = False
  115. def get_context_data(self, **kwargs):
  116. # context = super().get_context_data(**kwargs)
  117. if self.embed :
  118. kwargs['embed'] = True
  119. # context['credits'] = Credit.objects.select_related().get(product = self.kwargs['pk'])
  120. # context['descriptions'] = Description.objects.select_related().get(product = self.kwargs['pk'])
  121. # context['interactions'] = Interaction.objects.select_related().get(product=self.kwargs['pk'])
  122. # context['PAUI'] = Category.objects.get(short_name='PAUI')
  123. # context['wohnprojekt'] = self.object.wohnprojekt
  124. # print (context)
  125. # print (context['object'])
  126. # print (context['product'])
  127. return super().get_context_data(**kwargs)
  128. def post(self, request, *args, **kwargs):
  129. vote = int(request.POST['vote'])
  130. comment = str(request.POST['comment'])
  131. if vote <= 10:
  132. try:
  133. get_vote = Vote.objects.get(juryMember=self.request.user, product=self.kwargs['pk'])
  134. get_vote.vote = vote
  135. get_vote.comment = comment
  136. get_vote.save()
  137. except Vote.DoesNotExist:
  138. get_vote = Vote(product = Product.objects.get(pk=self.kwargs['pk']), juryMember= self.request.user, vote = vote, comment=comment)
  139. get_vote.save()
  140. else:
  141. return HttpResponseRedirect(request.path)
  142. return HttpResponseRedirect(reverse('products'))
  143. class VoteView(LoginRequiredMixin, generic.ListView):
  144. model = Product
  145. template_name='marktplatz/voteDetail.html'
  146. def get_context_data(self, **kwargs):
  147. context = super().get_context_data(**kwargs)
  148. context['user'] = User.objects.filter(groups__name='JuryMembers')
  149. return context
  150. class CidView(LoginRequiredMixin, generic.ListView):
  151. model = Product
  152. template_name='marktplatz/votes_cid.html'
  153. def get_context_data(self, **kwargs):
  154. context = super().get_context_data(**kwargs)
  155. return context
  156. def post(self, request, *args, **kwargs):
  157. for pk in request.POST.dict():
  158. if not 'csrfmiddlewaretoken' in pk:
  159. if request.POST[pk] != '' and ('cid' in pk):
  160. now_product = Product.objects.get(pk=pk.split('.')[0])
  161. now_product.class_cid = request.POST[pk]
  162. now_product.save()
  163. if request.POST[pk] != '' and ('sub' in pk):
  164. now_product = Product.objects.get(pk=pk.split('.')[0])
  165. now_product.sumbitted = request.POST[pk]
  166. now_product.save()
  167. return HttpResponseRedirect('')
  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. now_Product = Product.objects.get(pk=keys[1])
  182. if public[elemk] == 'true':
  183. now_Product.public = True
  184. now_Product.save()
  185. else:
  186. now_Product.public = False
  187. now_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. now_Product = Product.objects.get(pk=keys[1])
  194. if edit[elemk] == 'true':
  195. now_Product.edit = True
  196. now_Product.save()
  197. else:
  198. now_Product.edit = False
  199. now_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. # if form_contact.is_valid():
  296. # contact = form_contact.save(commit=False)
  297. # contact.user = user
  298. # contact.save()
  299. #
  300. # return redirect('products')
  301. context = request.GET.dict()
  302. context['form'] = RegisterForm
  303. context['signUp'] = SignUpForm
  304. return render(request, self.template_name, context)
  305. class NewSubmitView(LoginRequiredMixin, FormView):
  306. use_ajax = True
  307. template_name = 'marktplatz/add.html'
  308. model = Product
  309. def get(self, request,*args, **kwargs):
  310. # form = self.form_class()
  311. context = request.GET.dict()
  312. context['product'] = SubmissionForm
  313. # context['lnks'] = LinkFormSet
  314. # context['lnks_helper'] = FormsetHelper()
  315. context['use_ajax'] = True
  316. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  317. return render(request, self.template_name, context)
  318. def post(self, request):
  319. product_f = SubmissionForm(request.POST, request.FILES)
  320. if product_f.is_valid():
  321. product = product_f.save(commit=False)
  322. product.contact = Contact.objects.get(user = self.request.user)
  323. product.edit=True
  324. product.public = False
  325. product.sumbitted = config.CURRENT_EVENT
  326. product.save()
  327. product_f.save_m2m()
  328. if 'addImage' in request.POST:
  329. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': product.pk}))
  330. return HttpResponseRedirect(reverse('my-products'))
  331. else:
  332. context = request.POST.dict()
  333. context['product'] = product_f
  334. context['product_errors'] = product_f.errors
  335. context['use_ajax'] = True
  336. return render(request, self.template_name, context)
  337. class uploadView(LoginRequiredMixin, FormView):
  338. use_ajax = True
  339. template_name = 'marktplatz/file_upload.html'
  340. def get(self, request, pk):
  341. user = self.request.user
  342. contact = Contact.objects.get(user=user)
  343. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  344. raise Http404
  345. product = Product.objects.get(pk=pk)
  346. photo = product.media_set.count()
  347. video = product.video_set.count()
  348. context = request.GET.dict()
  349. contact = Contact.objects.get(user=self.request.user)
  350. product = get_object_or_404(Wohnprojekt, (Q(pk=pk) & Q(contact=contact)))
  351. context['product'] = product
  352. context['images'] = Media.objects.filter(product=product)
  353. context['video'] = Video.objects.filter(product=product)
  354. context['media'] = MediaForm
  355. context['media_count'] = False
  356. context['video_count'] = False
  357. if photo >= 7:
  358. context['media_count'] = True
  359. if video >= 2:
  360. context['video_count'] = True
  361. context['use_ajax'] = True
  362. context['warning'] = False
  363. return render(request, self.template_name, context)
  364. def post(self, request, pk):
  365. vid1_f = MediaForm(request.POST, request.FILES)
  366. product = Product.objects.get(pk=pk)
  367. i = product.media_set.count()
  368. i += product.video_set.count()
  369. video = product.video_set.count()
  370. photo = product.media_set.count()
  371. context = request.GET.dict()
  372. contact = Contact.objects.get(user=self.request.user)
  373. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  374. context['product'] = product
  375. context['images'] = Media.objects.filter(product=product)
  376. context['video'] = Video.objects.filter(product=product)
  377. context['media'] = MediaForm
  378. context['media_count'] = False
  379. context['video_count'] = False
  380. context['use_ajax'] = True
  381. context['warning'] = False
  382. if vid1_f.is_valid():
  383. image = vid1_f.cleaned_data['image']
  384. name = image.name
  385. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  386. if photo < 7:
  387. vid1 = Media()
  388. vid1.product = product
  389. vid1.filename = name
  390. vid1.copyright = vid1_f.cleaned_data['copyright']
  391. vid1.name_for = vid1_f.cleaned_data['name_for']
  392. vid1.image.save(name, image)
  393. vid1.image_small.save(str(i) + '_small', image)
  394. vid1.image_medium.save(str(i) + '_medium', image)
  395. vid1.image_big.save(str(i) + '_big', image)
  396. vid1.image_norm.save(str(i) + '_norm', image)
  397. vid1.save
  398. photo += 1
  399. else:
  400. context['warning'] = "You can not upload any more photos!"
  401. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  402. if video < 2:
  403. #TODO clean image here!
  404. vid1 = Video()
  405. vid1.product = product
  406. vid1.filename = name
  407. vid1.copyright = vid1_f.cleaned_data['copyright']
  408. vid1.name_for = vid1_f.cleaned_data['name_for']
  409. vid1.image.save(name, image)
  410. vid1.save
  411. video += 1
  412. else:
  413. context['warning'] = "You can not upload any more videos!"
  414. vid1_f.delete_temporary_files()
  415. if photo >= 7:
  416. context['media_count'] = True
  417. if video >= 2:
  418. context['video_count'] = True
  419. return render(request, self.template_name, context)
  420. handle_upload = FileFormUploader()
  421. class EditView(FormView):
  422. template_name = 'marktplatz/add.html'
  423. def get(self, request, pk):
  424. user = self.request.user
  425. contact = Contact.objects.get(user=user)
  426. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  427. raise Http404
  428. context = request.GET.dict()
  429. context['product'] = SubmissionForm(instance=Wohnprojekt.objects.get(pk=pk))
  430. linkFormSet = inlineformset_factory(Product,Link, form=LinkForm, extra=0)
  431. myLinkFormSet = linkFormSet(instance= Product.objects.get(pk=pk) )
  432. context['lnks'] = myLinkFormSet
  433. context['lnks_helper'] = FormsetHelper()
  434. context['use_ajax'] = True
  435. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  436. return render(request, self.template_name, context)
  437. def post(self, request, pk):
  438. product_f = SubmissionForm(request.POST, request.FILES, instance=Wohnprojekt.objects.get(pk=pk))
  439. # credits_f = CreditForm(request.POST,instance = Credit.objects.select_related().get(product=pk))
  440. # description_f = DescriptionForm(request.POST,instance = Description.objects.select_related().get(product=pk))
  441. # lnks_f = LinkFormSet(request.POST,instance = Wohnprojekt.objects.get(pk=pk) )
  442. # interaction_f = InteractionForm(request.POST,instance = Interaction.objects.select_related().get(product=pk))
  443. vid1_f = VideoForm(request.POST, request.FILES)
  444. if product_f.is_valid():
  445. update_fields = []
  446. # https://stackoverflow.com/questions/35879101/how-to-determine-if-a-field-has-changed-in-a-django-modelform/43550210
  447. if product_f.has_changed():
  448. if 'frei' in product_f.changed_data:
  449. print('frei changed')
  450. product_f.save( )
  451. product = product_f.save()
  452. # for lnk in lnks_f:
  453. # if lnk.is_valid():
  454. # print( "link valid ......................." )
  455. # lnk_ = lnk.save(commit=False)
  456. # lnk_.product = product
  457. # lnk_.save()
  458. if 'addImage' in request.POST:
  459. return HttpResponseRedirect(reverse('add-Image', kwargs={'pk': pk}))
  460. return HttpResponseRedirect(reverse('my-products'))
  461. else:
  462. print( "not saved xxxxxxx" )
  463. context = request.GET.dict()
  464. context['product'] = product_f
  465. context['product_errors'] = product_f.errors
  466. # context['lnks'] = lnks_f
  467. # context['lnks_helper'] = FormsetHelper()
  468. context['use_ajax'] = True
  469. return render(request, self.template_name, context)
  470. class UsersProducts(LoginRequiredMixin, generic.ListView):
  471. model = Product
  472. template_name='marktplatz/myProducts.html'
  473. def get_queryset(self):
  474. contact = Contact.objects.get(user=self.request.user)
  475. return Product.objects.filter(contact=contact)
  476. def get_context_data(self, **kwargs):
  477. context = super().get_context_data(**kwargs)
  478. contact = Contact.objects.get(user=self.request.user)
  479. context['user'] = self.request.user
  480. return context
  481. class MediaView(LoginRequiredMixin, TemplateView):
  482. template_name = 'marktplatz/media_overview.html'
  483. def get(self, request, pk):
  484. self.user = self.request.user
  485. user= self.user
  486. contact = Contact.objects.get(user=user)
  487. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  488. raise Http404
  489. context = request.GET.dict()
  490. contact = Contact.objects.get(user=self.request.user)
  491. product = get_object_or_404(Product, (Q(pk = pk) & Q(contact = contact)))
  492. context['product'] = product
  493. context['media'] = Media.objects.filter(product=product)
  494. context['video'] = Video.objects.filter(product=product)
  495. return render(request, self.template_name, context)
  496. def delete_media(request, pk):
  497. user = request.user
  498. contact = Contact.objects.get(user=user)
  499. object = Media.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. def delete_video(request, pk):
  505. user = request.user
  506. contact = Contact.objects.get(user=user)
  507. object = Video.objects.get(id=pk)
  508. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  509. raise Http404
  510. object.delete()
  511. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))