Merge branch 'requests'
This commit is contained in:
commit
85dfd065e6
|
@ -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
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -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')),
|
||||||
|
|
|
@ -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)
|
|
||||||
|
|
|
@ -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'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -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',
|
||||||
|
),
|
||||||
|
]
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue