views.py 23 KB

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