Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
| branch | status |
|---------|--------|
| master | [![Build Status](https://travis-ci.com/timelytasks/timelyapi.svg?branch=master)](https://travis-ci.com/timelytasks/timelyapi)|
| develop | [![Build Status](https://travis-ci.com/timelytasks/timelyapi.svg?branch=develop)](https://travis-ci.com/timelytasks/timelyapi)|
| dev | [![Build Status](https://travis-ci.com/timelytasks/timelyapi.svg?branch=development)](https://travis-ci.com/timelytasks/timelyapi)|

# timelyapi

Expand Down
16 changes: 16 additions & 0 deletions app/projects/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django_filters import rest_framework as filters
from app.projects.models import Task


class TaskFilter(filters.FilterSet):
class Meta:
model = Task
fields = {
"title": ["exact"],
"due_date": ["exact", "year__gt", "year__lt"],
"value": ["exact", "lt", "gt"],
"project": ["exact"],
"completed": ["exact"],
# 'price': ['lt', 'gt'],
# 'release_date': ['exact', 'year__gt'],
}
11 changes: 11 additions & 0 deletions app/projects/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django.db import models
from django.db.models import Q


class GenericManager(models.Manager):
def owner_or_shared_with(self, user_id):
return (
self.filter(Q(created_by=user_id) | Q(shared_with=user_id))
.distinct()
.order_by("created_at")
)
13 changes: 12 additions & 1 deletion app/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from djmoney.models.fields import MoneyField
from app.projects.managers import GenericManager


class Project(models.Model):
Expand Down Expand Up @@ -32,6 +33,9 @@ class Project(models.Model):
# tasks = models.ManyToManyField("tasks.Task", blank=True)
completed = models.BooleanField(default=False, null=False)

# Managers
objects = GenericManager()

TASK = 1
BUDGET = 2
DIARY = 3
Expand All @@ -51,6 +55,13 @@ class Meta:
def __str__(self):
return self.title

def save(self, *args, **kwargs):
if self.value is not None and self.initial_value is None:
self.initial_value = self.value
elif self.initial_value is not None and self.value is None:
self.value = self.initial_value
super().save(*args, **kwargs)


class Task(models.Model):

Expand All @@ -76,7 +87,7 @@ class Task(models.Model):
completed = models.BooleanField(default=False, null=False)

# Managers
objects = models.Manager()
objects = GenericManager()

class Meta:
ordering = ["created_at"]
Expand Down
4 changes: 2 additions & 2 deletions app/projects/tests_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def test_task_not_visible_for_everyone(self):
response = self.api.get("/api/v1/tasks/")

self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, [])
self.assertEqual(dict(response.data), {'count': 0, 'next': None, 'previous': None, 'results': []})

def test_task_visible_for_shared_people(self):
"""
Expand All @@ -106,7 +106,7 @@ def test_task_visible_for_shared_people(self):
response = self.api.get("/api/v1/tasks/")

self.assertEqual(response.status_code, 200)
response_task = response.data[0]
response_task = response.data["results"][0]
for key, data in task.items():
self.assertEqual(response_task.get(key), data)

Expand Down
18 changes: 4 additions & 14 deletions app/projects/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from rest_framework import viewsets, permissions
from rest_framework.decorators import action
from rest_framework.response import Response
from app.projects.filters import TaskFilter
from app.projects.models import Project, Task
from app.projects.serializers import ProjectsSerializer, TasksSerializer
from app.projects.permissions import (
Expand Down Expand Up @@ -31,13 +32,7 @@ def get_queryset(self):
"""
Gets all projects that have been created by or shared with someone
"""
return (
Project.objects.filter(
Q(created_by=self.request.user) | Q(shared_with=self.request.user)
)
.distinct()
.order_by("created_at")
)
return Project.objects.owner_or_shared_with(self.request.user)

@action(detail=True, methods=["get"])
def summary(self, request, pk=None):
Expand Down Expand Up @@ -71,6 +66,7 @@ class TaskViewSet(viewsets.ModelViewSet):

permission_classes = [permissions.IsAuthenticated, IsOwnerOrIsSharedWithTask]
serializer_class = TasksSerializer
filterset_class = TaskFilter

def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
Expand All @@ -79,10 +75,4 @@ def get_queryset(self):
"""
Gets all tasks that have been created by or shared with someone
"""
return (
Task.objects.filter(
Q(created_by=self.request.user) | Q(shared_with=self.request.user)
)
.distinct()
.order_by("created_at")
)
return Task.objects.owner_or_shared_with(self.request.user)
7 changes: 6 additions & 1 deletion app/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
"rest_auth.registration",
"app.users",
"app.projects",
"django_filters",
]

MIDDLEWARE = [
Expand Down Expand Up @@ -86,7 +87,11 @@
REST_FRAMEWORK = {
# REST Filtering
# https://www.django-rest-framework.org/api-guide/filtering/
"DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"]
"DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"],
# REST Pagination
# https://www.django-rest-framework.org/api-guide/pagination/
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100,
}

# Database
Expand Down