views.py 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289
  1. import csv
  2. import json
  3. import copy
  4. import itertools
  5. from PIL import Image
  6. from PIL import Image
  7. from PIL import ImageFont
  8. from PIL import ImageDraw
  9. from django.contrib import messages
  10. from django.contrib.auth import login, authenticate
  11. from django.contrib.auth.models import User
  12. from django.contrib.auth.mixins import LoginRequiredMixin
  13. from django.contrib.auth.decorators import login_required
  14. from django.contrib.auth.models import User, Group
  15. from django.core import serializers
  16. from django.core.files import File
  17. from django.core.mail import send_mail
  18. from django.core.exceptions import PermissionDenied
  19. from django.urls import reverse, reverse_lazy
  20. from django.http import HttpResponseRedirect, Http404, HttpResponse
  21. from django.db import models
  22. from django.db.models import Count
  23. from django.views import generic, View
  24. from django.views.generic import TemplateView
  25. from django.views.generic import FormView
  26. from django.views.generic.edit import *
  27. from django.views.generic.detail import *
  28. from django.shortcuts import render, get_object_or_404, redirect, get_list_or_404, get_object_or_404
  29. from django.forms import formset_factory
  30. from django.forms import BaseModelFormSet
  31. from django.forms import modelformset_factory, inlineformset_factory
  32. from django.forms.models import model_to_dict
  33. # from django_countries import countries
  34. from django.template import Context, Template
  35. from django.conf import settings
  36. from django_file_form.uploader import FileFormUploader
  37. from constance import config
  38. from django.db.models import Q
  39. from newsletter.forms import *
  40. from newsletter.views import *
  41. from post_office import mail
  42. from .models import *
  43. from .forms import *
  44. from .utils import *
  45. # Create your views here.
  46. def index(request):
  47. context = {}
  48. return render(request, 'index.html', context = context)
  49. def about(request):
  50. context = {}
  51. context = {'generic_text': Template(config.ABOUT_CONTENT).render(Context(context))}
  52. return render(request, 'marktplatz/generic_text.html', context)
  53. def submit(request):
  54. context = {}
  55. context = {'generic_text': Template(config.SUBMIT_TEXT).render(Context(context))}
  56. return render(request,'marktplatz/generic_text.html', context)
  57. def error_404_view(request, exception):
  58. data = {"name": "Markplatz"}
  59. return render(request,'marktplatz/error_404.html', data)
  60. @login_required
  61. def home(request):
  62. user = request.user
  63. if user.groups.filter(name='submission').exists():
  64. return HttpResponseRedirect(reverse('meine-projekte'))
  65. else:
  66. return HttpResponseRedirect(reverse('products'))
  67. class genericView(TemplateView):
  68. template_name = 'marktplatz/generic.html'
  69. def get(self, request, *args, **kwargs):
  70. instance = get_object_or_404(Wohnprojekt, pk=2 )
  71. context = {}
  72. context['object'] = model_to_dict ( instance )
  73. context['object']['myfield'] = '----------------------------'
  74. return render(request, self.template_name, context )
  75. class pagesView(TemplateView):
  76. template_name = 'marktplatz/generic.html'
  77. def get(self, request, *args, **kwargs):
  78. context = {}
  79. context['content_a'] = ""
  80. context['content_b'] = config
  81. # print (config.items() )
  82. if 'page' in kwargs:
  83. context['content_a'] = kwargs['page']
  84. try:
  85. context['content_a'] = '<br><h2>' + kwargs['page'] + "</h2><br><br>"
  86. context['content_b'] = getattr(config , kwargs['page'], '')
  87. except KeyError:
  88. raise Http404
  89. # if config.get ( kwargs['page'] ) != None:
  90. # context['content_b'] = config.get ( kwargs['page'] )
  91. return render(request, self.template_name, context )
  92. class ContactUpdateView(LoginRequiredMixin, UpdateView):
  93. template_name = 'marktplatz/form.html'
  94. model = Contact
  95. form_class = RegisterForm
  96. success_url = reverse_lazy('index')
  97. def get_object(self, queryset=None):
  98. obj = super().get_object()
  99. if ( obj.user_can_manage(self.request.user) ):
  100. return obj
  101. raise PermissionDenied
  102. class SubscribeRequestView( SubscribeRequestView):
  103. form_class = NewsletterForm
  104. class OnlySubscribeRequestView( SubscribeRequestView):
  105. template_name = 'newsletter/subscription_subscribe_onlyns.html'
  106. class AgentNewslwtterFormView(TemplateView):
  107. template_name = 'marktplatz/form_newsletter.html'
  108. embed = False
  109. def get_context_data(self, **kwargs):
  110. if self.embed :
  111. kwargs['embed'] = True
  112. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  113. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  114. return super().get_context_data(**kwargs)
  115. def get(self, request, *args, **kwargs):
  116. context = self.get_context_data()
  117. context['form'] = AgentNewslwtterForm( )
  118. context['bz'] = request.GET.get('bz', '') # used in template to check a district by default.
  119. return render(request, self.template_name, context )
  120. class AgentNewsletterSubscribeView( SubscribeRequestView ):
  121. action = 'subscribe'
  122. # form_class = AgentNewslwtterForm
  123. confirm = False
  124. embed = False
  125. def get_context_data(self, **kwargs):
  126. if self.embed :
  127. kwargs['embed'] = True
  128. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  129. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  130. # kwargs['news_form'] = SubscribeRequestForm()
  131. return super().get_context_data(**kwargs)
  132. def post(self, request, *args, **kwargs):
  133. data = request.POST.copy()
  134. data["email"] = data["email_field"]
  135. agent_form = AgentNewslwtterForm ( data )
  136. if agent_form.is_valid():
  137. agent_form.save()
  138. else:
  139. context = {}
  140. context['form_errors'] = agent_form.errors
  141. context['form'] = agent_form
  142. return render(request, 'marktplatz/form_newsletter.html', context )
  143. if agent_form.cleaned_data['subscribe'] :
  144. return super().post( request, *args, **kwargs )
  145. # return super(SubscribeRequestView, self).post( request, *args, **kwargs )
  146. context = {}
  147. context['content_a'] = '<br><i class="fas fa-bell"></i><br><h2>Dein Suchagent wurde erstellt!</h2>'
  148. return render(request, 'marktplatz/generic.html', context )
  149. # def dispatch(self, request, *args, **kwargs):
  150. #
  151. # return super(SubscribeRequestView, self).dispatch( request, *args, **kwargs )
  152. class SearchAgentCreate(CreateView):
  153. model = SearchAgent
  154. template_name = 'marktplatz/form.html'
  155. fields = 'ort', 'email'
  156. success_url = reverse_lazy('generic')
  157. embed = False
  158. def get_context_data(self, **kwargs):
  159. if self.embed :
  160. kwargs['embed'] = True
  161. kwargs['form_content'] = '<i class="fas fa-bell"></i> Suchagent einrichten'
  162. kwargs['content_a'] = 'Dein Suchagent wurde erstellt!'
  163. # kwargs['news_form'] = SubscribeRequestForm()
  164. return super().get_context_data(**kwargs)
  165. def form_valid(self, form):
  166. super().form_valid(form)
  167. return render(self.request, 'marktplatz/generic.html',
  168. self.get_context_data(form=form))
  169. class SearchAgentDelete(DeleteView):
  170. model = SearchAgent
  171. template_name = 'marktplatz/form_delete.html'
  172. success_url = reverse_lazy('products')
  173. def get(self, request, *args, **kwargs):
  174. searchagent = get_object_or_404(SearchAgent, pk= kwargs.get('pk') )
  175. context = {}
  176. context['form_content'] = 'Dein Suchagent wurde gelöscht!'
  177. if searchagent.hash == kwargs.get('hash'):
  178. return super().get(self, request, *args, **kwargs)
  179. else:
  180. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  181. return render(request, self.template_name, context )
  182. class ProductDelete(LoginRequiredMixin, DeleteView):
  183. model = Product
  184. template_name = 'marktplatz/product_delete.html'
  185. success_url = reverse_lazy('products')
  186. def get(self, request, *args, **kwargs):
  187. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  188. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  189. if (contact.id == product.contact.id) :
  190. return super(ProductDelete, self).get(self, request, *args, **kwargs)
  191. else:
  192. raise Http404
  193. def post(self, request, *args, **kwargs):
  194. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  195. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  196. if (contact.id == product.contact.id) :
  197. # context = {}
  198. # context['form_content'] = 'Dein Projekt wird gelöscht, wenn die Seite live ist!'
  199. # if settings.DEBUG:
  200. # return render(request, self.template_name, context )
  201. # else:
  202. return super().post(self, request, *args, **kwargs)
  203. else:
  204. raise Http404
  205. context = {}
  206. context['form_content'] = 'Oopala, das hat nicht geklappt.'
  207. return render(request, self.template_name, context )
  208. class ProductPublish(LoginRequiredMixin, DetailView):
  209. model = Product
  210. template_name = 'marktplatz/generic.html'
  211. # success_url = reverse_lazy('products')
  212. #
  213. def get(self, request, *args, **kwargs):
  214. contact = get_object_or_404(Contact, user= self.request.user ) # Contact.objects.get(user=self.request.user)
  215. product = get_object_or_404(Product, pk= kwargs.get('pk') )
  216. if (contact.id == product.contact.id) :
  217. panel_url = reverse( 'admin-panel' )
  218. admin_url = reverse( 'admin:marktplatz_product_change', args=(product.id,) )
  219. publishmessage = "Ein Benutzer möchte folgendes Projekt freigeben: {}. Du kannst es über das Admin-Panel freigeben: {} oder auch hier: {}".format( product.name, request.get_host() + panel_url, request.get_host() + admin_url )
  220. htmlhmessage = '<p>Hallo Team!</p><p>Ein Benutzer m&ouml;chte folgendes Projekt freigeben: {}. Du kannst es &uuml;ber das Admin-Panel freigeben: <a href="//{}">Admin-panel</a> oder auch hier: <a href="//{}">Backend</a></p><p>Lieben Gr&uuml;&szlig;e aus dem Server.</p>'.format(
  221. product.name,
  222. request.get_host() + panel_url,
  223. request.get_host() + admin_url
  224. )
  225. # print (publishmessage)
  226. mail.send(
  227. 'gemeinschaffen@realitylab.at', # List of email addresses also accepted
  228. config.EMAIL_NOREPLY,
  229. subject='Projekt Freischaltung',
  230. headers={ 'Reply-To': 'gemeinschaffen@realitylab.at' },
  231. message= publishmessage,
  232. html_message= htmlhmessage,
  233. )
  234. # userList =User.objects.filter( is_superuser = 1 )
  235. # for superuser in userList:
  236. # mail.send(
  237. # superuser.email, # List of email addresses also accepted
  238. # config.EMAIL_NOREPLY,
  239. # subject='Projekt Freischaltung',
  240. # headers={ 'Reply-To': superuser.email },
  241. # message= publishmessage,
  242. # # html_message='Hi <strong>there</strong>!',
  243. # )
  244. context = {}
  245. context["content_a"] = '<br><br><br>Die Freigabe wurde beantragt.<br><br><br>'
  246. return render(request, self.template_name, context )
  247. else:
  248. raise Http404
  249. def post(self, request, *args, **kwargs):
  250. return self.get(self, request, *args, **kwargs)
  251. class ProductsView(generic.ListView):
  252. model = Product
  253. template_name = 'marktplatz/product_overview.html'
  254. context_object_name = 'object_list'
  255. def get_queryset(self):
  256. qs = super().get_queryset()
  257. user = self.request.user
  258. qs = qs.order_by('frei')
  259. if user.groups.filter(name='submission').exists():
  260. contact = Contact.objects.get(user=user)
  261. return qs.filter(contact = contact)
  262. if user.is_superuser:
  263. return qs
  264. qs = qs.filter(public = True)
  265. return qs
  266. def get_context_data(self, **kwargs):
  267. context = super().get_context_data(**kwargs)
  268. orts = {}
  269. urbanem = False
  270. for product in context['object_list']:
  271. if not product.ort in orts:
  272. orts[product.ort] = product.get_ort_display()
  273. if hasattr(product, "urbanem"):
  274. urbanem = True
  275. context['ort_dict'] = orts
  276. context['urbanem'] = urbanem
  277. context['user'] = self.request.user
  278. context['frei_list'] = Product.FREI
  279. context['status_list'] = Product.STATUS
  280. context['sponsor_cards'] = Template( config.SPONSOR_CARDS ).render( Context(context) )
  281. context['main_card'] = Template( config.MAIN_CARD ).render( Context(context) )
  282. context['type'] = 'BASE'
  283. context['textSearchForm'] = textSearchForm()
  284. return context
  285. class WohnprojekteView(ProductsView):
  286. model = Wohnprojekt
  287. template_name = 'marktplatz/product_overview.html'
  288. context_object_name = 'object_list'
  289. def get_context_data(self, **kwargs):
  290. context = super().get_context_data(**kwargs)
  291. raum_agebote = {}
  292. for product in context['object_list']:
  293. for raum in product.raumangebot:
  294. if not (raum in raum_agebote):
  295. raum_agebote[raum] = product.raumangebot.choices[raum]
  296. context['raum_agebote_dict'] = raum_agebote
  297. context['frei_list'][0] = ('JAJA', 'Platz frei')
  298. context['altneu_list'] = Wohnprojekt.ALTNEU
  299. context['type'] = 'WOHN'
  300. return context
  301. class MobilitaetsProjekteView(ProductsView):
  302. model = MobilitaetsProjekt
  303. template_name = 'marktplatz/product_overview.html'
  304. context_object_name = 'object_list'
  305. def get_context_data(self, **kwargs):
  306. context = super().get_context_data(**kwargs)
  307. context['type'] = 'MOBI'
  308. return context
  309. class ErnaerungsProjekteView(ProductsView):
  310. model = ErnaehrungsProjekt
  311. template_name = 'marktplatz/product_overview.html'
  312. context_object_name = 'object_list'
  313. def get_context_data(self, **kwargs):
  314. context = super().get_context_data(**kwargs)
  315. context['type'] = 'ERNA'
  316. return context
  317. class EnergyProjekteView(ProductsView):
  318. model = EnergyProjekt
  319. template_name = 'marktplatz/product_overview.html'
  320. context_object_name = 'object_list'
  321. def get_context_data(self, **kwargs):
  322. context = super().get_context_data(**kwargs)
  323. context['type'] = 'ENER'
  324. return context
  325. class FilterProductsView(ProductsView):
  326. def get_queryset(self, qfilter=None, **kwargs ):
  327. # original qs
  328. qs = super().get_queryset()
  329. if qfilter!=None:
  330. mfilter = {}
  331. mfilter[qfilter] = True
  332. qs = qs.filter ( **mfilter )
  333. qs = qs.order_by('frei')
  334. return qs.filter(public = True)
  335. def get(self, request, *args, **kwargs):
  336. qfilter = kwargs.get( 'filter', "" )
  337. if qfilter != "":
  338. self.object_list = self.get_queryset( qfilter = qfilter )
  339. allow_empty = self.get_allow_empty()
  340. context = self.get_context_data()
  341. return self.render_to_response(context)
  342. class UrbanemProductsView(WohnprojekteView):
  343. def get_queryset(self, qfilter=None, **kwargs ):
  344. # original qs
  345. qs = super().get_queryset()
  346. if qfilter!=None:
  347. mfilter = {}
  348. mfilter[qfilter] = True
  349. qs = qs.filter ( **mfilter )
  350. qs = qs.order_by('frei')
  351. return qs.filter(public = True)
  352. def get(self, request, *args, **kwargs):
  353. qfilter = 'urbanem'
  354. if qfilter != "":
  355. self.object_list = self.get_queryset( qfilter = qfilter )
  356. allow_empty = self.get_allow_empty()
  357. context = self.get_context_data()
  358. return self.render_to_response(context)
  359. class RealitylabProductsView(WohnprojekteView):
  360. def get_queryset(self, qfilter=None, **kwargs ):
  361. # original qs
  362. qs = super().get_queryset()
  363. if qfilter!=None:
  364. mfilter = {}
  365. mfilter[qfilter] = True
  366. qs = qs.filter ( **mfilter )
  367. qs = qs.order_by('frei')
  368. return qs.filter(public = True)
  369. def get(self, request, *args, **kwargs):
  370. qfilter = 'realitylab'
  371. if qfilter != "":
  372. self.object_list = self.get_queryset( qfilter = qfilter )
  373. allow_empty = self.get_allow_empty()
  374. context = self.get_context_data()
  375. return self.render_to_response(context)
  376. class SearchProductsView(ProductsView):
  377. def get_queryset(self, qfilter=None, **kwargs ):
  378. # original qs
  379. qs = super().get_queryset()
  380. user = self.request.user
  381. if qfilter!=None:
  382. qs = qs.filter (name__icontains= qfilter) | \
  383. qs.filter (claim__icontains= qfilter) | \
  384. qs.filter (beschreibung__icontains= qfilter) | \
  385. qs.filter (learning__icontains= qfilter) | \
  386. qs.filter (status__icontains= qfilter) | \
  387. qs.filter (adresse__icontains= qfilter) | \
  388. qs.filter (plz__icontains= qfilter) | \
  389. qs.filter (adresse__icontains= qfilter) | \
  390. qs.filter (ort__icontains= qfilter) | \
  391. qs.filter (website__icontains= qfilter) | \
  392. qs.filter (email__icontains= qfilter) | \
  393. qs.filter (kfrei__icontains= qfilter) | \
  394. qs.filter (rechtsform__icontains= qfilter) | \
  395. qs.filter (orga__icontains= qfilter)
  396. # qs = qs.filter ( stringToSearch__icontains= qfilter )
  397. qs = qs.order_by('frei')
  398. return qs.filter(public = True)
  399. def post(self, request, *args, **kwargs):
  400. qform = textSearchForm( request.POST )
  401. if qform.is_valid():
  402. self.object_list = self.get_queryset(qfilter= qform.cleaned_data["searchText"] )
  403. allow_empty = self.get_allow_empty()
  404. if not allow_empty:
  405. # When pagination is enabled and object_list is a queryset,
  406. # it's better to do a cheap query than to load the unpaginated
  407. # queryset in memory.
  408. if self.get_paginate_by(self.object_list) is not None and hasattr(self.object_list, 'exists'):
  409. is_empty = not self.object_list.exists()
  410. else:
  411. is_empty = not self.object_list
  412. if is_empty:
  413. raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.") % {
  414. 'class_name': self.__class__.__name__,
  415. })
  416. context = self.get_context_data()
  417. context['type']= kwargs['type']
  418. return self.render_to_response(context)
  419. class SearchWohnProjectsView(SearchProductsView):
  420. model = Wohnprojekt
  421. form_class = WohnprojektForm
  422. def get_queryset(self, qfilter=None, **kwargs ):
  423. # original qs
  424. qs = super().get_queryset()
  425. user = self.request.user
  426. if qfilter!=None:
  427. qs = qs.filter (name__icontains= qfilter) | \
  428. qs.filter (claim__icontains= qfilter) | \
  429. qs.filter (beschreibung__icontains= qfilter) | \
  430. qs.filter (learning__icontains= qfilter) | \
  431. qs.filter (status__icontains= qfilter) | \
  432. qs.filter (adresse__icontains= qfilter) | \
  433. qs.filter (plz__icontains= qfilter) | \
  434. qs.filter (adresse__icontains= qfilter) | \
  435. qs.filter (ort__icontains= qfilter) | \
  436. qs.filter (website__icontains= qfilter) | \
  437. qs.filter (email__icontains= qfilter) | \
  438. qs.filter (kfrei__icontains= qfilter) | \
  439. qs.filter (rechtsform__icontains= qfilter) | \
  440. qs.filter (orga__icontains= qfilter) | \
  441. qs.filter (eigentum__icontains= qfilter) | \
  442. qs.filter (schwerpunkt__icontains= qfilter) | \
  443. qs.filter (artmodell__icontains= qfilter) | \
  444. qs.filter (bautraeger__icontains= qfilter) | \
  445. qs.filter (architektur__icontains= qfilter) | \
  446. qs.filter (kflaechen__icontains= qfilter) | \
  447. qs.filter (gemeinschaftr__icontains= qfilter) | \
  448. qs.filter (kgemeinschaftr__icontains= qfilter) | \
  449. qs.filter (raumangebot__icontains= qfilter) | \
  450. qs.filter (kraumangebot__icontains= qfilter) | \
  451. qs.filter (gewerbe__icontains= qfilter) | \
  452. qs.filter (inseratstext__icontains= qfilter) | \
  453. qs.filter (sonderwohnformen__icontains= qfilter) | \
  454. qs.filter (karbeiten__icontains= qfilter) | \
  455. qs.filter (bauweise__icontains= qfilter) | \
  456. qs.filter (zielgruppen__icontains= qfilter) | \
  457. qs.filter (gprojekte__icontains= qfilter) | \
  458. qs.filter (oekologie__icontains= qfilter) | \
  459. qs.filter (freiraumangebote__icontains= qfilter)
  460. # qs = qs.filter ( stringToSearch__icontains= qfilter )
  461. qs = qs.order_by('frei')
  462. return qs.filter(public = True)
  463. class GenericSearchView(SearchProductsView):
  464. def dispatch(self, request, *args, **kwargs):
  465. # print( kwargs['type'] )
  466. if self.kwargs['type'] == 'BASE':
  467. return super().dispatch(request, *args, **kwargs)
  468. elif self.kwargs['type'] == 'WOHN':
  469. return SearchWohnProjectsView.as_view()(request, *args, **kwargs)
  470. elif self.kwargs['type'] == 'MOBI':
  471. self.model = MobilitaetsProjekt
  472. self.form_class = MobilitaetsForm
  473. return super().dispatch(request, *args, **kwargs)
  474. elif self.kwargs['type'] == 'ERNA':
  475. self.model = ErnaehrungsProjekt
  476. self.form_class = ErnaehrungsForm
  477. return super().dispatch(request, *args, **kwargs)
  478. elif self.kwargs['type'] == 'ENER':
  479. self.model = EnergyProjekt
  480. self.form_class = EnergyForm
  481. return super().dispatch(request, *args, **kwargs)
  482. class ProductsListView(generic.ListView):
  483. model = Product
  484. template_name='marktplatz/object_list.html'
  485. embed = False
  486. def get_queryset(self):
  487. # original qs
  488. qs = super().get_queryset()
  489. self.user = self.request.user
  490. user = self.user
  491. if user.is_superuser:
  492. return qs
  493. qs = qs.filter(public = True)
  494. return qs
  495. def get_context_data(self, **kwargs):
  496. if self.embed :
  497. kwargs['embed'] = True
  498. return super().get_context_data(**kwargs)
  499. #
  500. # DETAIL
  501. #
  502. class ProduktDetailView(generic.DetailView):
  503. model = Product
  504. template_name = 'marktplatz/product_detail.html'
  505. embed = False
  506. def get_context_data(self, **kwargs):
  507. if self.embed :
  508. kwargs['embed'] = True
  509. return super().get_context_data(**kwargs)
  510. def post(self, request, *args, **kwargs):
  511. # vote = int(request.POST['vote'])
  512. comment = str(request.POST['comment'])
  513. return HttpResponseRedirect( reverse('products') )
  514. class ProduktGenericDetailView(ProduktDetailView):
  515. def dispatch(self, request, *args, **kwargs):
  516. if self.kwargs['type'] == 'BASE':
  517. super().dispatch(request, *args, **kwargs)
  518. elif self.kwargs['type'] == 'WOHN':
  519. self.model = Wohnprojekt
  520. return super().dispatch(request, *args, **kwargs)
  521. elif self.kwargs['type'] == 'MOBI':
  522. self.model = MobilitaetsProjekt
  523. return super().dispatch(request, *args, **kwargs)
  524. elif self.kwargs['type'] == 'ERNA':
  525. self.model = ErnaehrungsProjekt
  526. return super().dispatch(request, *args, **kwargs)
  527. elif self.kwargs['type'] == 'ENER':
  528. self.model = EnergyProjekt
  529. return super().dispatch(request, *args, **kwargs)
  530. raise Http404('Keine Objekte gefunden')
  531. class WohnprojektDetailView(ProduktDetailView):
  532. model = Wohnprojekt
  533. template_name = 'marktplatz/product_detail.html'
  534. class MobilitaetsProjektDetailView(ProduktDetailView):
  535. model = MobilitaetsProjekt
  536. template_name = 'marktplatz/product_detail.html'
  537. class ErnaehrungsProjektDetailView(ProduktDetailView):
  538. model = ErnaehrungsProjekt
  539. template_name = 'marktplatz/product_detail.html'
  540. class EnergyProjektProjektDetailView(ProduktDetailView):
  541. model = EnergyProjekt
  542. template_name = 'marktplatz/product_detail.html'
  543. class ProduktCardDetailView(ProduktDetailView):
  544. template_name = 'marktplatz/product_detail_card.html'
  545. class ProduktGenericCardDetailView(ProduktDetailView):
  546. template_name = 'marktplatz/product_detail_card.html'
  547. def dispatch(self, request, *args, **kwargs):
  548. if self.kwargs['type'] == 'BASE':
  549. super().dispatch(request, *args, **kwargs)
  550. elif self.kwargs['type'] == 'WOHN':
  551. self.model = Wohnprojekt
  552. return super().dispatch(request, *args, **kwargs)
  553. elif self.kwargs['type'] == 'MOBI':
  554. self.model = MobilitaetsProjekt
  555. return super().dispatch(request, *args, **kwargs)
  556. elif self.kwargs['type'] == 'ERNA':
  557. self.model = ErnaehrungsProjekt
  558. return super().dispatch(request, *args, **kwargs)
  559. elif self.kwargs['type'] == 'ENER':
  560. self.model = EnergyProjekt
  561. return super().dispatch(request, *args, **kwargs)
  562. #
  563. #
  564. # CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE CREATE
  565. #
  566. #
  567. class ProductDispatchView(TemplateView):
  568. template_name = 'marktplatz/product_create_dispatch.html'
  569. class ProductCreateView(LoginRequiredMixin, CreateView):
  570. template_name = 'marktplatz/product_create.html'
  571. model = Product
  572. form_class = ProductForm
  573. gotoPics = False
  574. # success_url = reverse_lazy('meine-projekte')
  575. def get_context_data(self, **kwargs):
  576. context = super().get_context_data(**kwargs)
  577. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  578. return context
  579. def get_success_url(self):
  580. return reverse_lazy('meine-projekte')
  581. def post(self, request, *args, **kwargs):
  582. if 'add-image' in request.POST:
  583. self.gotoPics = True
  584. return super().post(self, request, *args, **kwargs)
  585. def form_valid(self, form):
  586. product = form.save(commit=False)
  587. product.contact = Contact.objects.get(user = self.request.user)
  588. product.save()
  589. self.object = product
  590. return HttpResponseRedirect(self.get_success_url())
  591. class ProductGenericCreateView(ProductCreateView):
  592. def dispatch(self, request, *args, **kwargs):
  593. if self.kwargs['type'] == 'BASE':
  594. super().dispatch(request, *args, **kwargs)
  595. elif self.kwargs['type'] == 'WOHN':
  596. self.model = Wohnprojekt
  597. self.form_class = WohnprojektForm
  598. return super().dispatch(request, *args, **kwargs)
  599. elif self.kwargs['type'] == 'MOBI':
  600. self.model = MobilitaetsProjekt
  601. self.form_class = MobilitaetsForm
  602. return super().dispatch(request, *args, **kwargs)
  603. elif self.kwargs['type'] == 'ERNA':
  604. self.model = ErnaehrungsProjekt
  605. self.form_class = ErnaehrungsForm
  606. return super().dispatch(request, *args, **kwargs)
  607. elif self.kwargs['type'] == 'ENER':
  608. self.model = EnergyProjekt
  609. self.form_class = EnergyForm
  610. return super().dispatch(request, *args, **kwargs)
  611. raise Http404('Keine Objekte gefunden' )
  612. class ProductCreateAddPicsView (ProductGenericCreateView):
  613. def get_success_url(self):
  614. return reverse_lazy('add-image', kwargs={'pk': self.object.id } )
  615. class ProductCreatePublishView (ProductGenericCreateView):
  616. def get_success_url(self):
  617. return reverse_lazy('product-publish', kwargs={'pk': self.object.id } )
  618. #
  619. #
  620. # UPDATE UPDATE UPDATE UPDATE UPDATE UPDATE UPDATE
  621. #
  622. #
  623. class ProductUpdateView(LoginRequiredMixin, UpdateView):
  624. template_name = 'marktplatz/product_create.html'
  625. model = Product
  626. form_class = ProductForm
  627. gotoPics = False
  628. # success_url =
  629. def get_context_data(self, **kwargs):
  630. context = super().get_context_data(**kwargs)
  631. context['info_txt'] = Template(config.INFO_TXT).render(Context(context))
  632. return context
  633. def get_success_url(self):
  634. return reverse_lazy('meine-projekte')
  635. def get_object(self, queryset=None):
  636. obj = super().get_object()
  637. if ( obj.user_can_manage(self.request.user) ):
  638. return obj
  639. raise PermissionDenied
  640. def post(self, request, *args, **kwargs):
  641. if 'add-image' in request.POST:
  642. self.gotoPics = True
  643. return super().post(self, request, *args, **kwargs)
  644. def get(self, request, *args, **kwargs):
  645. return super().get(self, request, *args, **kwargs)
  646. def form_valid(self, form):
  647. product = form.save(commit=False)
  648. product.contact = Contact.objects.get(user = self.request.user)
  649. product.save()
  650. self.object = product
  651. return HttpResponseRedirect(self.get_success_url())
  652. class ProductGenericUpdateView(ProductUpdateView):
  653. model = Product
  654. form_class = ProductForm
  655. def dispatch(self, request, *args, **kwargs):
  656. if self.kwargs['type'] == 'BASE':
  657. super().dispatch(request, *args, **kwargs)
  658. elif self.kwargs['type'] == 'WOHN':
  659. self.model = Wohnprojekt
  660. self.form_class = WohnprojektForm
  661. return super().dispatch(request, *args, **kwargs)
  662. elif self.kwargs['type'] == 'MOBI':
  663. self.model = MobilitaetsProjekt
  664. self.form_class = MobilitaetsForm
  665. return super().dispatch(request, *args, **kwargs)
  666. elif self.kwargs['type'] == 'ERNA':
  667. self.model = ErnaehrungsProjekt
  668. self.form_class = ErnaehrungsForm
  669. return super().dispatch(request, *args, **kwargs)
  670. elif self.kwargs['type'] == 'ENER':
  671. self.model = EnergyProjekt
  672. self.form_class = EnergyForm
  673. return super().dispatch(request, *args, **kwargs)
  674. raise Http404('Keine Objekte gefunden' )
  675. class ProductUpdateAddPicsView (ProductGenericUpdateView):
  676. def get_success_url(self):
  677. return reverse_lazy('add-image', kwargs={'pk': self.object.id } )
  678. class ProductUpdatePublishView (ProductGenericUpdateView):
  679. def get_success_url(self):
  680. return reverse_lazy('product-publish', kwargs={'pk': self.object.id } )
  681. #
  682. # USERS USERS USERS USERS USERS USERS USERS USERS
  683. #
  684. class UsersProducts(LoginRequiredMixin, generic.ListView):
  685. model = Product
  686. template_name='marktplatz/myProducts.html'
  687. def get_queryset(self):
  688. contact = Contact.objects.get(user=self.request.user)
  689. wohnprojekte = Wohnprojekt.objects.filter(contact=contact)
  690. mobilitaetsprojekte = MobilitaetsProjekt.objects.filter(contact=contact)
  691. ernaehrungsprojekte = ErnaehrungsProjekt.objects.filter(contact=contact)
  692. energyprojekte = EnergyProjekt.objects.filter(contact=contact)
  693. projekte = list(itertools.chain(wohnprojekte, mobilitaetsprojekte, ernaehrungsprojekte, energyprojekte))
  694. return projekte
  695. def get_context_data(self, **kwargs):
  696. context = super().get_context_data(**kwargs)
  697. contact = Contact.objects.get(user=self.request.user)
  698. context['user'] = self.request.user
  699. return context
  700. class AdminView(LoginRequiredMixin, generic.ListView):
  701. model = Product
  702. template_name='marktplatz/admin_panel.html'
  703. def get_context_data(self, **kwargs):
  704. context = super().get_context_data(**kwargs)
  705. return context
  706. def post(self, request, *args, **kwargs):
  707. context = request.POST.dict()
  708. public = {k: v for k, v in context.items() if k.startswith('product_p')}
  709. for elemk in public:
  710. keys = elemk.split(".")
  711. current_product = Product.objects.get(pk=keys[1])
  712. if public[elemk] == 'true':
  713. if current_product.public == False :
  714. current_product.public = True
  715. current_product.save()
  716. else:
  717. current_product.public = False
  718. current_product.save()
  719. return super().get(self, request, *args, **kwargs)
  720. class registerView(FormView):
  721. template_name = 'marktplatz/form.html'
  722. # form_class = RegisterForm
  723. def get(self, request):
  724. # form = self.form_class()
  725. context = request.GET.dict()
  726. context['form_content'] = '<p>Willkommen! Wir freuen uns, dass du bei uns mitmachen willst!</p> <p>Nach der Registrierung kannst du euer Projekt eintragen.</p> <p><br />Evtl. m&ouml;chtest du Kollegen die M&ouml;glichkeit geben auch zum Projekteintrag beizutragen. Wir haben nichts dagegen, dass du deine Logindaten mit Anderen aus deiner Projektgemeinschaft teilst. Dann k&ouml;nnen sie dir beim Eintragen helfen. Man kann Projekteintr&auml;ge &uuml;brigens auch zwischenspeichern, sodass ihr zeitversetzt daran arbeiten k&ouml;nnt. Wenn mehrere diesen Account teilen w&auml;hle dein Passwort mit Bedacht!</p>'
  727. context['form'] = RegisterForm
  728. context['signUp'] = SignUpForm
  729. return render(request, self.template_name, context)
  730. def post(self, request):
  731. # print ( request.POST.dict() )
  732. form = SignUpForm(request.POST)
  733. form_contact = RegisterForm(request.POST)
  734. #
  735. # Filter existing emails
  736. #
  737. qs = Contact.objects.filter( email=form_contact.data['email'] )
  738. if ( qs.count() ):
  739. form_contact.add_error('email', "Email already in use, please reset your password.")
  740. if form.is_valid() and form_contact.is_valid():
  741. contact = form_contact.save(commit=False)
  742. user = form.save()
  743. user.email = contact.email
  744. user.first_name = contact.first_name
  745. user.last_name = contact.last_name
  746. user.set_password(form.cleaned_data.get('password1'))
  747. user.save()
  748. contact.user = user
  749. contact.save()
  750. username = form.cleaned_data.get('username')
  751. raw_password = form.cleaned_data.get('password1')
  752. group = Group.objects.get(name='submission')
  753. group.user_set.add(user)
  754. user = authenticate(username=username, password=raw_password)
  755. if user is not None:
  756. # A backend authenticated the credentials
  757. login(request, user)
  758. return redirect('products')
  759. else:
  760. # No backend authenticated the credentials
  761. send_mail(
  762. 'error with auth',
  763. 'Error in authorization.' + json.dumps( request.POST.dict() ),
  764. 'awards@berta.mediaarchitecture.org',
  765. ['juan@mediaarchitecture.org'],
  766. fail_silently=False,
  767. )
  768. return redirect('products')
  769. login(request, user)
  770. else:
  771. # print (form.errors)
  772. # print (form_contact.errors)
  773. send_mail(
  774. 'error with auth',
  775. '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),
  776. 'awards@berta.mediaarchitecture.org',
  777. ['juan@mediaarchitecture.org'],
  778. fail_silently=False,
  779. )
  780. context = request.POST.dict()
  781. context['signUp'] = form
  782. context['form'] = form_contact
  783. context['signup_errors'] = form.errors
  784. context['contact_errors'] = form_contact.errors
  785. return render(request, self.template_name, context)
  786. context = request.GET.dict()
  787. context['form'] = RegisterForm
  788. context['signUp'] = SignUpForm
  789. return render(request, self.template_name, context)
  790. class lightboximg(LoginRequiredMixin, TemplateView):
  791. template_name = "marktplatz/importold.html"
  792. def post(self, request):
  793. context = {'faild': ''}
  794. faild = ''
  795. from1 = int(request.POST['from'])
  796. to = int(request.POST['to'])
  797. products = Product.objects.all()
  798. i = 0
  799. for product in products:
  800. i+=1
  801. if (i < from1):
  802. continue
  803. if (i > to):
  804. break
  805. medias = product.media_set.all()
  806. for oldmedia in medias:
  807. if not oldmedia.image_norm:
  808. oldpic = oldmedia.image
  809. oldmedia.image_norm.save(oldmedia.filename() + '_norm', oldpic)
  810. oldmedia.save
  811. return render(request, self.template_name, context)
  812. def get(self, request):
  813. context = {'faild': ''}
  814. faild = ''
  815. context['faild'] = faild
  816. return render(request, self.template_name, context)
  817. class addImageView(LoginRequiredMixin, FormView):
  818. use_ajax = True
  819. template_name = 'marktplatz/file_upload.html'
  820. def get(self, request, pk):
  821. user = self.request.user
  822. contact = Contact.objects.get(user=user)
  823. # print (contact.id)
  824. product = Product.objects.filter(contact=contact)
  825. if not Product.objects.filter(contact=contact).filter(pk=pk).exists():
  826. # print( "no product 1" )
  827. raise Http404
  828. product = Product.objects.get(pk=pk)
  829. photo = product.media_set.count()
  830. video = product.video_set.count()
  831. context = request.GET.dict()
  832. contact = Contact.objects.get(user=self.request.user)
  833. # print( "before 404" )
  834. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  835. context['product'] = product
  836. context['images'] = Media.objects.filter(product=product)
  837. context['video'] = Video.objects.filter(product=product)
  838. context['media'] = MediaForm
  839. context['media_count'] = False
  840. context['video_count'] = False
  841. if photo >= 7:
  842. context['media_count'] = True
  843. if video >= 2:
  844. context['video_count'] = True
  845. # context['use_ajax'] = True
  846. context['warning'] = False
  847. return render(request, self.template_name, context)
  848. def post(self, request, pk):
  849. vid1_f = MediaForm(request.POST, request.FILES)
  850. product = Product.objects.get(pk=pk)
  851. i = product.media_set.count()
  852. i += product.video_set.count()
  853. video = product.video_set.count()
  854. photo = product.media_set.count()
  855. context = request.GET.dict()
  856. contact = Contact.objects.get(user=self.request.user)
  857. product = get_object_or_404(Product, (Q(pk=pk) & Q(contact=contact)))
  858. context['product'] = product
  859. context['images'] = Media.objects.filter(product=product)
  860. context['video'] = Video.objects.filter(product=product)
  861. context['media'] = MediaForm
  862. context['media_count'] = False
  863. context['video_count'] = False
  864. context['use_ajax'] = True
  865. context['warning'] = False
  866. if vid1_f.is_valid():
  867. image = vid1_f.cleaned_data['image']
  868. name = image.name
  869. if 'png' in name or 'jpg' in name or 'jpeg' in name:
  870. if photo < 7:
  871. vid1 = Media()
  872. vid1.product = product
  873. vid1.filename = name
  874. vid1.copyright = vid1_f.cleaned_data['copyright']
  875. vid1.name_for = vid1_f.cleaned_data['name_for']
  876. vid1.image.save(name, image)
  877. vid1.image_small.save(str(i) + '_small', image)
  878. vid1.image_medium.save(str(i) + '_medium', image)
  879. vid1.image_big.save(str(i) + '_big', image)
  880. vid1.image_norm.save(str(i) + '_norm', image)
  881. vid1.save
  882. photo += 1
  883. else:
  884. context['warning'] = "You can not upload any more photos!"
  885. elif 'mp4' in name or 'm3u8' in name or 'm4v' in name:
  886. if video < 2:
  887. #TODO clean image here!
  888. vid1 = Video()
  889. vid1.product = product
  890. vid1.filename = name
  891. vid1.copyright = vid1_f.cleaned_data['copyright']
  892. vid1.name_for = vid1_f.cleaned_data['name_for']
  893. vid1.image.save(name, image)
  894. vid1.save
  895. video += 1
  896. else:
  897. context['warning'] = "You can not upload any more videos!"
  898. vid1_f.delete_temporary_files()
  899. if photo >= 7:
  900. context['media_count'] = True
  901. if video >= 2:
  902. context['video_count'] = True
  903. return render(request, self.template_name, context)
  904. handle_upload = FileFormUploader()
  905. def delete_media(request, pk):
  906. user = request.user
  907. contact = Contact.objects.get(user=user)
  908. object = Media.objects.get(id=pk)
  909. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  910. raise Http404
  911. object.delete()
  912. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
  913. def delete_video(request, pk):
  914. user = request.user
  915. contact = Contact.objects.get(user=user)
  916. object = Video.objects.get(id=pk)
  917. if not Product.objects.filter(contact=contact).filter(pk=object.product.pk).exists():
  918. raise Http404
  919. object.delete()
  920. return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))