Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: User Feedback for PickUps Tests #342

Merged
merged 55 commits into from Aug 31, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
33da12d
added the correct API endpoint feedback
mddemarie Aug 2, 2017
2e69dd5
added the correct API endpoint feedback
mddemarie Aug 2, 2017
b9f091a
corrected API endpoint feedback
mddemarie Aug 2, 2017
68ce735
Flaked some files
tingled Aug 2, 2017
cb80da5
changes with flake8
id-gue Aug 2, 2017
26cc533
cleaned up stored.py
id-gue Aug 3, 2017
6baa704
minor changes in url routers
id-gue Aug 3, 2017
38b2a7e
Merge branch 'master' into feedback3
id-gue Aug 3, 2017
e150a0f
playing with FeedbackSerializer and FeedbackModel
id-gue Aug 3, 2017
b249a20
deleted the signal post_feedback_create from signals.py and comment i…
id-gue Aug 4, 2017
d104828
upload the changes in signals.py (which should habe been in the previ…
id-gue Aug 5, 2017
c223d82
Merge branch 'master' of https://github.com/yunity/foodsaving-backend…
mddemarie Aug 9, 2017
232a3c9
Merge remote-tracking branch 'origin' into feedback3
id-gue Aug 9, 2017
ee9e81e
fixing bugs
id-gue Aug 9, 2017
2dc7ec7
Merge branch 'feedback3' of https://github.com/yunity/foodsaving-back…
mddemarie Aug 9, 2017
946248b
commented out the fields given_by and about in the feedback model for…
id-gue Aug 9, 2017
abf0322
created a first test case, started with another test if the user is n…
mddemarie Aug 10, 2017
85f5aa5
added a new test for which has to be written code in serializers.py
mddemarie Aug 10, 2017
6eaf4b0
added user validation for feedback serializer
id-gue Aug 10, 2017
96cb616
removed unneeded code from the serializer and added comments to the t…
id-gue Aug 10, 2017
f3ce6d7
master changes
id-gue Aug 11, 2017
a39a2aa
added a new test and changed the Feedback validator
id-gue Aug 11, 2017
fdaec89
bug fixing in test_feedback and playing with FeedbackSerializer
id-gue Aug 11, 2017
33c96aa
Merge branch 'master' of github.com:yunity/foodsaving-backend into fe…
mddemarie Aug 11, 2017
2e3d9f8
added 1 positive test for displaying feedback as user + uncommented n…
mddemarie Aug 11, 2017
7046560
flake8
id-gue Aug 12, 2017
58d8639
Merge branch 'feedback3' of github.com:yunity/foodsaving-backend into…
id-gue Aug 12, 2017
911ce98
Merge remote-tracking branch 'origin/master' into feedback3
id-gue Aug 15, 2017
982c5ea
added migration
id-gue Aug 15, 2017
92f8b98
flake8 corrections
id-gue Aug 16, 2017
4e0ca15
fixed 1 test with failing non-group member and extended validate_abou…
mddemarie Aug 16, 2017
a6067f5
added test that fails if you are not assigned to the pickup
mddemarie Aug 17, 2017
eaff340
corrected the code in serializers for Feedback, validate_about
mddemarie Aug 17, 2017
06eae20
Merge remote-tracking branch 'origin/master' into feedback3
mddemarie Aug 22, 2017
3d4372c
Merge remote-tracking branch 'origin/master' into feedback3
id-gue Aug 22, 2017
9a90ddc
minor changes in FeedbackSerializer
id-gue Aug 22, 2017
7550e84
Merge remote-tracking branch 'origin/feedback3' into feedback3
id-gue Aug 22, 2017
9177dbc
fixed the Feedback api test (members / users)
id-gue Aug 23, 2017
6d66fe1
added permission IsMember to FeedbackViewSet and three tests for the …
id-gue Aug 23, 2017
18ac4bf
experimented with FeedbackViewSet, tried to raise Http404 error if th…
mddemarie Aug 23, 2017
76f798b
turned one failing into passing test and added one more test + more c…
mddemarie Aug 24, 2017
6fcde9e
added tilmanns code to the serializer
id-gue Aug 25, 2017
7e29335
Merge remote-tracking branch 'origin/master' into feedback3
id-gue Aug 29, 2017
afea4d2
added Feedback.objects.create() to SetUpClass in test_feedback_api.py
mddemarie Aug 30, 2017
97ca298
added queryset function to api to fix the FeedbackTests for list
id-gue Aug 31, 2017
a852bab
Merge remote-tracking branch 'origin/master' into feedback3
mddemarie Aug 31, 2017
57e97e0
Merge remote-tracking branch 'origin/feedback3' into feedback3
mddemarie Aug 31, 2017
65764cd
more tests for getting single feedback with GET.id for non-user, user…
mddemarie Aug 31, 2017
a622ed1
1 more test for the feedback in the future + comment clean-up
mddemarie Aug 31, 2017
fe5c149
Merge remote-tracking branch 'origin/master' into feedback3
id-gue Aug 31, 2017
e99ba1a
test the feedback model and changed the parameters of the fields weig…
id-gue Aug 31, 2017
7889a69
Merge remote-tracking branch 'origin/master' into feedback3
mddemarie Aug 31, 2017
f4d790a
Merge remote-tracking branch 'origin/feedback3' into feedback3
mddemarie Aug 31, 2017
d58cb45
removed comments and all unnecessary code
mddemarie Aug 31, 2017
de676d4
test if feedback can be created if comment to long
id-gue Aug 31, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
5 changes: 4 additions & 1 deletion config/urls.py
Expand Up @@ -24,7 +24,7 @@
from foodsaving.groups.api import GroupViewSet
from foodsaving.history.api import HistoryViewSet
from foodsaving.invitations.api import InvitationsViewSet, InvitationAcceptViewSet
from foodsaving.stores.api import StoreViewSet, PickupDateViewSet, PickupDateSeriesViewSet
from foodsaving.stores.api import StoreViewSet, PickupDateViewSet, PickupDateSeriesViewSet, FeedbackViewSet
from foodsaving.userauth.api import AuthViewSet
from foodsaving.users.api import UserViewSet

Expand Down Expand Up @@ -53,6 +53,9 @@
router.register('invitations', InvitationsViewSet)
router.register('invitations', InvitationAcceptViewSet)

# Feedback endpoints
router.register(r'feedback', FeedbackViewSet)

urlpatterns = [
url(r'^api/', include(router.urls, namespace='api')),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
Expand Down
Binary file added foodsaving/.DS_Store
Binary file not shown.
Binary file added foodsaving/stores/.DS_Store
Binary file not shown.
38 changes: 27 additions & 11 deletions foodsaving/stores/api.py
Expand Up @@ -7,12 +7,19 @@
from rest_framework.viewsets import GenericViewSet

from foodsaving.stores.filters import PickupDatesFilter, PickupDateSeriesFilter
from foodsaving.stores.permissions import IsUpcoming, HasNotJoinedPickupDate, HasJoinedPickupDate, IsEmptyPickupDate, \
IsNotFull
from foodsaving.stores.serializers import StoreSerializer, PickupDateSerializer, PickupDateSeriesSerializer, \
PickupDateJoinSerializer, PickupDateLeaveSerializer
from foodsaving.stores.models import Store as StoreModel, PickupDate as PickupDateModel, \
PickupDateSeries as PickupDateSeriesModel
from foodsaving.stores.permissions import (
IsUpcoming, HasNotJoinedPickupDate, HasJoinedPickupDate, IsEmptyPickupDate,
IsNotFull)
from foodsaving.stores.serializers import (
StoreSerializer, PickupDateSerializer, PickupDateSeriesSerializer,
PickupDateJoinSerializer, PickupDateLeaveSerializer, FeedbackSerializer)
from foodsaving.stores.models import (
Store as StoreModel,
PickupDate as PickupDateModel,
PickupDateSeries as PickupDateSeriesModel,
Feedback as FeedbackModel
)

from foodsaving.utils.mixins import PartialUpdateModelMixin

pre_pickup_delete = Signal()
Expand Down Expand Up @@ -59,6 +66,20 @@ def perform_destroy(self, store):
PickupDateSeriesModel.objects.filter(store=store).delete()


class FeedbackViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet
):
serializer_class = FeedbackSerializer
queryset = FeedbackModel.objects.all()
permission_classes = (IsAuthenticated,)

def get_queryset(self):
return self.queryset.filter(about__store__group__members=self.request.user)


class PickupDateSeriesViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
Expand All @@ -67,12 +88,7 @@ class PickupDateSeriesViewSet(
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
"""
Pickup Date Series

# Query parameters
- `?store` - filter by store id
"""
serializer_class = PickupDateSeriesSerializer
queryset = PickupDateSeriesModel.objects
filter_backends = (filters.DjangoFilterBackend,)
Expand Down
33 changes: 33 additions & 0 deletions foodsaving/stores/migrations/0016_feedback.py
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-10 09:55
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('stores', '0015_auto_20170727_0943'),
]

operations = [
migrations.CreateModel(
name='Feedback',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('created_at', models.DateTimeField(default=django.utils.timezone.now)),
('weight', models.PositiveIntegerField()),
('comment', models.CharField(max_length=80)),
('about', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='stores.PickupDate')),
('given_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_feedback', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
]
16 changes: 16 additions & 0 deletions foodsaving/stores/migrations/0017_merge_20170815_0930.py
@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-15 09:30
from __future__ import unicode_literals

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('stores', '0016_feedback'),
('stores', '0016_pickupdate_done_and_processed'),
]

operations = [
]
20 changes: 20 additions & 0 deletions foodsaving/stores/migrations/0018_auto_20170831_1256.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-31 12:56
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('stores', '0017_merge_20170815_0930'),
]

operations = [
migrations.AlterField(
model_name='feedback',
name='weight',
field=models.PositiveIntegerField(blank=True),
),
]
20 changes: 20 additions & 0 deletions foodsaving/stores/migrations/0019_auto_20170831_1306.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-31 13:06
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('stores', '0018_auto_20170831_1256'),
]

operations = [
migrations.AlterField(
model_name='feedback',
name='weight',
field=models.PositiveIntegerField(blank=True, null=True),
),
]
20 changes: 20 additions & 0 deletions foodsaving/stores/migrations/0020_auto_20170831_1312.py
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-31 13:12
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('stores', '0019_auto_20170831_1306'),
]

operations = [
migrations.AlterField(
model_name='feedback',
name='comment',
field=models.CharField(max_length=100000),
),
]
22 changes: 22 additions & 0 deletions foodsaving/stores/migrations/0021_auto_20170831_1341.py
@@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2017-08-31 13:41
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 = [
('stores', '0020_auto_20170831_1312'),
]

operations = [
migrations.AlterField(
model_name='feedback',
name='given_by',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='feedback', to=settings.AUTH_USER_MODEL),
),
]
7 changes: 7 additions & 0 deletions foodsaving/stores/models.py
Expand Up @@ -30,6 +30,13 @@ def __str__(self):
return '{} ({})'.format(self.name, self.group)


class Feedback(BaseModel):
given_by = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='feedback')
about = models.ForeignKey('PickupDate')
weight = models.PositiveIntegerField(blank=True, null=True)
comment = models.CharField(max_length=settings.DESCRIPTION_MAX_LENGTH)


class PickupDateSeriesManager(models.Manager):
@transaction.atomic
def create_all_pickup_dates(self):
Expand Down
30 changes: 27 additions & 3 deletions foodsaving/stores/serializers.py
Expand Up @@ -8,9 +8,12 @@

from django.conf import settings
from foodsaving.history.utils import get_changed_data
from foodsaving.stores.models import PickupDate as PickupDateModel
from foodsaving.stores.models import PickupDateSeries as PickupDateSeriesModel
from foodsaving.stores.models import Store as StoreModel
from foodsaving.stores.models import (
PickupDate as PickupDateModel,
Feedback as FeedbackModel,
PickupDateSeries as PickupDateSeriesModel,
Store as StoreModel,
)
from foodsaving.stores.signals import post_pickup_create, post_pickup_modify, post_pickup_join, post_pickup_leave, \
post_series_create, post_series_modify, post_store_create, post_store_modify

Expand Down Expand Up @@ -229,3 +232,24 @@ def validate_weeks_in_advance(self, w):
if w < 1:
raise serializers.ValidationError(_('Set at least one week in advance'))
return w


class FeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = FeedbackModel
fields = ['id', 'weight', 'comment', 'about', 'given_by']
read_only_fields = ('given_by',)

# Tilmanns code (is it to save a user_id of the logged-in user?)
def create(self, validated_data):
validated_data['given_by'] = self.context['request'].user
return super().create(validated_data)

def validate_about(self, about):
user = self.context['request'].user
group = about.store.group
if not group.is_member(user):
raise serializers.ValidationError(_('You are not member of the store\'s group.'))
if not about.is_collector(user):
raise serializers.ValidationError(_('You aren\'t assign to the pickup.'))
return about