diff --git a/config/settings/production.py b/config/settings/production.py index 6be8331..ec13148 100644 --- a/config/settings/production.py +++ b/config/settings/production.py @@ -44,6 +44,7 @@ CSRF_COOKIE_SECURE = True #disabledd so csrf works with ajax CSRF_COOKIE_HTTPONLY = False X_FRAME_OPTIONS = 'SAMEORIGIN' +X_FRAME_OPTIONS = 'ALLOW-FROM https://riot.im' # SITE CONFIGURATION # ------------------------------------------------------------------------------ diff --git a/config/settings/stage.py b/config/settings/stage.py index 2ca202e..bfde0aa 100644 --- a/config/settings/stage.py +++ b/config/settings/stage.py @@ -44,6 +44,7 @@ CSRF_COOKIE_SECURE = True #disabledd so csrf works with ajax CSRF_COOKIE_HTTPONLY = False X_FRAME_OPTIONS = 'SAMEORIGIN' +X_FRAME_OPTIONS = 'ALLOW-FROM https://riot.im' # SITE CONFIGURATION # ------------------------------------------------------------------------------ diff --git a/config/urls.py b/config/urls.py index 78628a4..27ee4d1 100644 --- a/config/urls.py +++ b/config/urls.py @@ -21,7 +21,7 @@ from mhackspace.base.views import markdown_uploader from mhackspace.blog.views import PostViewSet, CategoryViewSet, BlogPost, PostList from mhackspace.blog.sitemaps import PostSitemap, CategorySitemap from mhackspace.feeds.views import FeedViewSet, ArticleViewSet -from mhackspace.requests.views import RequestsForm, RequestsList +from mhackspace.requests.views import RequestsForm, RequestsList, RequestsDetail, RequestsDetailForm from mhackspace.rfid.views import DeviceViewSet, AuthUserWithDeviceViewSet from mhackspace.register.views import RegisterForm @@ -51,8 +51,14 @@ urlpatterns = [ url(r'^chat/$', TemplateView.as_view(template_name='pages/chat.html'), name='chat'), url(r'^mailing-list/$', TemplateView.as_view(template_name='pages/mailing-list.html'), name='group'), url(r'^contact/$', contact, name='contact'), + url(r'^requests/$', RequestsList.as_view(), name='requests'), url(r'^requests/create$', RequestsForm.as_view(), name='requests_form'), + url( + r'^requests/(?P\d+)/$', + RequestsDetail.as_view(template_name='pages/requests-detail.html'), + name='requests_detail'), + url(r'^requests/(?P\d+)/submit/$', RequestsDetailForm.as_view(template_name='pages/requests-detail.html'), name='requests_detail_form'), url(r'^discuss/', include('spirit.urls')), url(r'^api/v1/', include(router.urls, namespace='v1')), diff --git a/mhackspace/requests/forms.py b/mhackspace/requests/forms.py index 5403e49..e4ccb3e 100644 --- a/mhackspace/requests/forms.py +++ b/mhackspace/requests/forms.py @@ -1,17 +1,14 @@ from django import forms -from mhackspace.requests.models import UserRequest -from mhackspace.requests.models import REQUEST_TYPES +from mhackspace.requests.models import UserRequest, UserRequestsComment class UserRequestForm(forms.ModelForm): class Meta: model = UserRequest - exclude = ['user', 'created_date'] - # description = forms.CharField( - # required=True, - # widget=forms.Textarea - # ) - # request_type = forms.ChoiceField( - # required=True, - # widget=forms.Select, - # choices=REQUEST_TYPES) + exclude = ['user', 'created_date', 'acquired'] + + +class UserRequestFormComment(forms.ModelForm): + class Meta: + model = UserRequestsComment + exclude = ['user', 'created_date', 'request'] diff --git a/mhackspace/requests/migrations/0010_auto_20180115_1355.py b/mhackspace/requests/migrations/0010_auto_20180115_1355.py new file mode 100644 index 0000000..c60787f --- /dev/null +++ b/mhackspace/requests/migrations/0010_auto_20180115_1355.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-01-15 13:55 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('requests', '0009_userrequest_acquired'), + ] + + operations = [ + migrations.CreateModel( + name='UserRequestComments', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('comment', models.TextField(help_text='Your comments')), + ('created_date', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + migrations.AlterModelOptions( + name='userrequest', + options={'ordering': ('acquired', 'created_date')}, + ), + migrations.AddField( + model_name='userrequestcomments', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='requests.UserRequest'), + ), + ] diff --git a/mhackspace/requests/migrations/0011_auto_20180115_1416.py b/mhackspace/requests/migrations/0011_auto_20180115_1416.py new file mode 100644 index 0000000..893ed34 --- /dev/null +++ b/mhackspace/requests/migrations/0011_auto_20180115_1416.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-01-15 14:16 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('requests', '0010_auto_20180115_1355'), + ] + + operations = [ + migrations.AddField( + model_name='userrequestcomments', + name='request', + field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to='requests.UserRequest'), + preserve_default=False, + ), + migrations.AlterField( + model_name='userrequest', + name='acquired', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='userrequestcomments', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/mhackspace/requests/migrations/0012_auto_20180115_1425.py b/mhackspace/requests/migrations/0012_auto_20180115_1425.py new file mode 100644 index 0000000..ab3c85b --- /dev/null +++ b/mhackspace/requests/migrations/0012_auto_20180115_1425.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-01-15 14:25 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('requests', '0011_auto_20180115_1416'), + ] + + operations = [ + migrations.RenameModel( + old_name='UserRequestComments', + new_name='UserRequestsComment', + ), + ] diff --git a/mhackspace/requests/models.py b/mhackspace/requests/models.py index 80729eb..8f6734f 100644 --- a/mhackspace/requests/models.py +++ b/mhackspace/requests/models.py @@ -2,8 +2,10 @@ from django.conf import settings from django.db import models +from django.urls import reverse from django.utils import timezone from django.db.models.signals import post_save +from martor.models import MartorField from mhackspace.base.tasks import matrix_message @@ -20,33 +22,38 @@ class UserRequest(models.Model): ) title = models.CharField(max_length=255, help_text='Whats being requested ?') request_type = models.IntegerField(choices=REQUEST_TYPES, null=False) - acquired = models.BooleanField() + acquired = models.BooleanField(default=False) cost = models.DecimalField( max_digits=6, decimal_places=2, help_text='Leave blank, if no associated cost, or add estimated cost if not sure.' ) - description = models.TextField(help_text="detail of what's being requested and where it can be purchased") + description = MartorField(help_text="detail of what's being requested and where it can be purchased") created_date = models.DateTimeField(default=timezone.now) - class Meta: - ordering = ('cost',) - def request_type_string(self): return REQUEST_TYPES[self.request_type][1] -# class UserRequestComments(models.Model): -# user = models.OneToOneField( -# settings.AUTH_USER_MODEL, related_name='+') -# comment = models.TextField() -# created_date = models.DateTimeField(default=timezone.now) + def get_absolute_url(self): + return reverse( + 'requests_detail', + kwargs={'pk': self.pk}) class Meta: ordering = ('acquired', 'created_date',) +class UserRequestsComment(models.Model): + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + request = models.ForeignKey(UserRequest, on_delete=models.CASCADE) + comment = MartorField(help_text='Your comments') + created_date = models.DateTimeField(default=timezone.now) + + def send_topic_update_email(sender, instance, **kwargs): - matrix_message.delay(prefix=' - REQUEST', message=instance.title) + matrix_message.delay( + prefix=' - REQUEST', + message='%s - %s' % (instance.title, instance.get_absolute_url())) post_save.connect(send_topic_update_email, sender=UserRequest) diff --git a/mhackspace/requests/views.py b/mhackspace/requests/views.py index 206818a..a1e351f 100644 --- a/mhackspace/requests/views.py +++ b/mhackspace/requests/views.py @@ -1,16 +1,16 @@ from django.contrib.auth.mixins import LoginRequiredMixin -from django.core.mail import EmailMessage from django.contrib import messages -from mhackspace.requests.forms import UserRequestForm -from mhackspace.requests.models import UserRequest -from django.views.generic import ListView +from mhackspace.requests.forms import UserRequestForm, UserRequestFormComment +from mhackspace.requests.models import UserRequest, UserRequestsComment +from django.views.generic import DetailView, ListView from django.views.generic.edit import FormView +from django.urls import reverse class RequestsForm(LoginRequiredMixin, FormView): template_name = 'pages/requests.html' form_class = UserRequestForm - success_url = '/requests' + success_url = '/requests/' def form_valid(self, form): if form.is_valid(): @@ -21,6 +21,36 @@ class RequestsForm(LoginRequiredMixin, FormView): return super(FormView, self).form_valid(form) +class RequestsDetailForm(LoginRequiredMixin, FormView): + template_name = 'pages/requests-detail.html' + form_class = UserRequestFormComment + + def get_success_url(self): + return reverse( + 'requests_detail', + kwargs={'pk': self.kwargs.get('pk')}) + + def form_valid(self, form): + if form.is_valid(): + obj = form.save(commit=False) + obj.user = self.request.user + obj.request_id = self.kwargs.get('pk') + obj.save() + messages.add_message(self.request, messages.INFO, 'Request comment added.') + return super(FormView, self).form_valid(form) + + +class RequestsDetail(LoginRequiredMixin, DetailView): + model = UserRequest + context_object_name = 'request_detail' + + def get_context_data(self, *args, **kwargs): + context = super(RequestsDetail, self).get_context_data(*args, **kwargs) + context['requests_comments'] = UserRequestsComment.objects.all() + context['requests_form'] = UserRequestFormComment + return context + + class RequestsList(LoginRequiredMixin, ListView): template_name = 'pages/requests.html' model = UserRequest diff --git a/mhackspace/templates/pages/requests-detail.html b/mhackspace/templates/pages/requests-detail.html new file mode 100644 index 0000000..538794a --- /dev/null +++ b/mhackspace/templates/pages/requests-detail.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% load i18n %} +{% load crispy_forms_tags %} +{% load recapture %} + + +{% block head-open-graph %} + + + + +{% endblock head-open-graph %} + +{% block content %} +

{{requests.title}}

+ +
+
+ {{requests.description}} +
+
+ + {% for comment in requests_comments %} + {{ comment.user }} +

{{ comment.comment }}

+ {% endfor %} + + {% if requests_form %} +
+ {% csrf_token %} + {{ requests_form|crispy }} + {{ google_capture }} + +
+ {% endif %} + +{% endblock content %} + +{% block javascript %} + {{ block.super }} + +{% endblock %} diff --git a/mhackspace/templates/pages/requests.html b/mhackspace/templates/pages/requests.html index a10bffc..ee40b06 100644 --- a/mhackspace/templates/pages/requests.html +++ b/mhackspace/templates/pages/requests.html @@ -60,7 +60,7 @@ {{ request.created_date }} - {{ request.title }} + {{ request.title }} diff --git a/requirements/base.txt b/requirements/base.txt index 4007be3..1c9215f 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -67,8 +67,10 @@ django-filter==1.0.2 coreapi # api libraries end -#martor==1.1.8 -martor==1.2.5 +#martor==1.2.5 + +git+git://github.com/olymk2/django-markdown-editor.git + # django-spirit django-djconfig django-haystack