Merge branch 'requests'

This commit is contained in:
Oliver Marks 2018-01-18 18:57:08 +00:00
commit 85dfd065e6
12 changed files with 205 additions and 31 deletions

View File

@ -44,6 +44,7 @@ CSRF_COOKIE_SECURE = True
#disabledd so csrf works with ajax #disabledd so csrf works with ajax
CSRF_COOKIE_HTTPONLY = False CSRF_COOKIE_HTTPONLY = False
X_FRAME_OPTIONS = 'SAMEORIGIN' X_FRAME_OPTIONS = 'SAMEORIGIN'
X_FRAME_OPTIONS = 'ALLOW-FROM https://riot.im'
# SITE CONFIGURATION # SITE CONFIGURATION
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -44,6 +44,7 @@ CSRF_COOKIE_SECURE = True
#disabledd so csrf works with ajax #disabledd so csrf works with ajax
CSRF_COOKIE_HTTPONLY = False CSRF_COOKIE_HTTPONLY = False
X_FRAME_OPTIONS = 'SAMEORIGIN' X_FRAME_OPTIONS = 'SAMEORIGIN'
X_FRAME_OPTIONS = 'ALLOW-FROM https://riot.im'
# SITE CONFIGURATION # SITE CONFIGURATION
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------

View File

@ -21,7 +21,7 @@ from mhackspace.base.views import markdown_uploader
from mhackspace.blog.views import PostViewSet, CategoryViewSet, BlogPost, PostList from mhackspace.blog.views import PostViewSet, CategoryViewSet, BlogPost, PostList
from mhackspace.blog.sitemaps import PostSitemap, CategorySitemap from mhackspace.blog.sitemaps import PostSitemap, CategorySitemap
from mhackspace.feeds.views import FeedViewSet, ArticleViewSet 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.rfid.views import DeviceViewSet, AuthUserWithDeviceViewSet
from mhackspace.register.views import RegisterForm 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'^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'^mailing-list/$', TemplateView.as_view(template_name='pages/mailing-list.html'), name='group'),
url(r'^contact/$', contact, name='contact'), url(r'^contact/$', contact, name='contact'),
url(r'^requests/$', RequestsList.as_view(), name='requests'), url(r'^requests/$', RequestsList.as_view(), name='requests'),
url(r'^requests/create$', RequestsForm.as_view(), name='requests_form'), url(r'^requests/create$', RequestsForm.as_view(), name='requests_form'),
url(
r'^requests/(?P<pk>\d+)/$',
RequestsDetail.as_view(template_name='pages/requests-detail.html'),
name='requests_detail'),
url(r'^requests/(?P<pk>\d+)/submit/$', RequestsDetailForm.as_view(template_name='pages/requests-detail.html'), name='requests_detail_form'),
url(r'^discuss/', include('spirit.urls')), url(r'^discuss/', include('spirit.urls')),
url(r'^api/v1/', include(router.urls, namespace='v1')), url(r'^api/v1/', include(router.urls, namespace='v1')),

View File

@ -1,17 +1,14 @@
from django import forms from django import forms
from mhackspace.requests.models import UserRequest from mhackspace.requests.models import UserRequest, UserRequestsComment
from mhackspace.requests.models import REQUEST_TYPES
class UserRequestForm(forms.ModelForm): class UserRequestForm(forms.ModelForm):
class Meta: class Meta:
model = UserRequest model = UserRequest
exclude = ['user', 'created_date'] exclude = ['user', 'created_date', 'acquired']
# description = forms.CharField(
# required=True,
# widget=forms.Textarea class UserRequestFormComment(forms.ModelForm):
# ) class Meta:
# request_type = forms.ChoiceField( model = UserRequestsComment
# required=True, exclude = ['user', 'created_date', 'request']
# widget=forms.Select,
# choices=REQUEST_TYPES)

View File

@ -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'),
),
]

View File

@ -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),
),
]

View File

@ -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',
),
]

View File

@ -2,8 +2,10 @@
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.db.models.signals import post_save from django.db.models.signals import post_save
from martor.models import MartorField
from mhackspace.base.tasks import matrix_message 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 ?') title = models.CharField(max_length=255, help_text='Whats being requested ?')
request_type = models.IntegerField(choices=REQUEST_TYPES, null=False) request_type = models.IntegerField(choices=REQUEST_TYPES, null=False)
acquired = models.BooleanField() acquired = models.BooleanField(default=False)
cost = models.DecimalField( cost = models.DecimalField(
max_digits=6, max_digits=6,
decimal_places=2, decimal_places=2,
help_text='Leave blank, if no associated cost, or add estimated cost if not sure.' 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) created_date = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('cost',)
def request_type_string(self): def request_type_string(self):
return REQUEST_TYPES[self.request_type][1] return REQUEST_TYPES[self.request_type][1]
# class UserRequestComments(models.Model): def get_absolute_url(self):
# user = models.OneToOneField( return reverse(
# settings.AUTH_USER_MODEL, related_name='+') 'requests_detail',
# comment = models.TextField() kwargs={'pk': self.pk})
# created_date = models.DateTimeField(default=timezone.now)
class Meta: class Meta:
ordering = ('acquired', 'created_date',) 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): 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) post_save.connect(send_topic_update_email, sender=UserRequest)

View File

@ -1,16 +1,16 @@
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.mail import EmailMessage
from django.contrib import messages from django.contrib import messages
from mhackspace.requests.forms import UserRequestForm from mhackspace.requests.forms import UserRequestForm, UserRequestFormComment
from mhackspace.requests.models import UserRequest from mhackspace.requests.models import UserRequest, UserRequestsComment
from django.views.generic import ListView from django.views.generic import DetailView, ListView
from django.views.generic.edit import FormView from django.views.generic.edit import FormView
from django.urls import reverse
class RequestsForm(LoginRequiredMixin, FormView): class RequestsForm(LoginRequiredMixin, FormView):
template_name = 'pages/requests.html' template_name = 'pages/requests.html'
form_class = UserRequestForm form_class = UserRequestForm
success_url = '/requests' success_url = '/requests/'
def form_valid(self, form): def form_valid(self, form):
if form.is_valid(): if form.is_valid():
@ -21,6 +21,36 @@ class RequestsForm(LoginRequiredMixin, FormView):
return super(FormView, self).form_valid(form) 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): class RequestsList(LoginRequiredMixin, ListView):
template_name = 'pages/requests.html' template_name = 'pages/requests.html'
model = UserRequest model = UserRequest

View File

@ -0,0 +1,44 @@
{% extends "base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}
{% load recapture %}
{% block head-open-graph %}
<meta property="og:title" content="New request made" />
<meta property="og:type" content="website" />
<meta property="og:url" content="{{ request.build_absolute_uri }}" />
<meta property="og:image" content="https://maidstone-hackspace.org.uk/static/images/android-chrome-192x192.png" />
{% endblock head-open-graph %}
{% block content %}
<h2>{{requests.title}}</h2>
<div class="row">
<div class="col">
{{requests.description}}
</div>
</div>
{% for comment in requests_comments %}
<b>{{ comment.user }}</b>
<p>{{ comment.comment }}</p>
{% endfor %}
{% if requests_form %}
<form method="POST" action="{% url 'requests_detail_form' request_detail.id %}" class="requests_detail_form">
{% csrf_token %}
{{ requests_form|crispy }}
{{ google_capture }}
<button class="btn btn-primary " type="submit" name="action">
<span class="fa fa-submit" ></span>
{% trans "Add Comment" %}</button>
</form>
{% endif %}
{% endblock content %}
{% block javascript %}
{{ block.super }}
<script src='https://www.google.com/recaptcha/api.js'></script>
{% endblock %}

View File

@ -60,7 +60,7 @@
{{ request.created_date }} {{ request.created_date }}
</td> </td>
<td> <td>
{{ request.title }} <a href="{% url 'requests_detail' request.id %}">{{ request.title }}</a>
</td> </td>
<td> <td>
<button data-toggle="collapse" data-target="#expand{{forloop.counter}}" class="fa fa-expand ml-auto" ></button> <button data-toggle="collapse" data-target="#expand{{forloop.counter}}" class="fa fa-expand ml-auto" ></button>

View File

@ -67,8 +67,10 @@ django-filter==1.0.2
coreapi coreapi
# api libraries end # 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-spirit
django-djconfig django-djconfig
django-haystack django-haystack