views.py 22 KB

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