Skip to content

Commit

Permalink
activity: Add news Models and APIs
Browse files Browse the repository at this point in the history
Co-authored-by: Harshith Pabbati <pabbatiharshith@gmail.com>
  • Loading branch information
govindgoel and harshithpabbati committed Jun 19, 2020
1 parent 9013715 commit cb1d1b0
Show file tree
Hide file tree
Showing 6 changed files with 184 additions and 0 deletions.
42 changes: 42 additions & 0 deletions activity/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from django.contrib import admin
from .models import *
from import_export.admin import ImportExportModelAdmin, ExportActionMixin


@admin.register(News)
class NewsAdmin(ImportExportModelAdmin, ExportActionMixin, admin.ModelAdmin):
fieldsets = [
('Basic Details', {
'fields': [
('author', 'pinned'),
('title', 'slug', 'cover'),
('date', 'category'),
'tags',
'description'
]
}),
]
list_display = ('title', 'category', 'pinned')
list_filter = ('category', 'pinned', 'tags')


@admin.register(Tag)
class TagAdmin(ImportExportModelAdmin, ExportActionMixin, admin.ModelAdmin):
fieldsets = [
('Basic Details', {
'fields': [
('name', 'author'),
]
}),
]


@admin.register(Category)
class CategoryAdmin(ImportExportModelAdmin, ExportActionMixin, admin.ModelAdmin):
fieldsets = [
('Basic Details', {
'fields': [
('name', 'author'),
]
}),
]
5 changes: 5 additions & 0 deletions activity/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class ActivityConfig(AppConfig):
name = 'activity'
55 changes: 55 additions & 0 deletions activity/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from django.db import models
from datetime import date
import uuid
from django.contrib.auth.models import User
from ckeditor.fields import RichTextField
from imagekit.models import ProcessedImageField
from framework.validators import validate_file_size, processed_image_field_specs


class Category(models.Model):
name = models.CharField(max_length=100)
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='Category_Author', blank=True, null=True)

class Meta:
verbose_name_plural = "Categories"
verbose_name = "Category"

def __str__(self):
return self.name


class Tag(models.Model):
name = models.CharField(max_length=100)
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='Tag_Author', blank=True, null=True)

class Meta:
verbose_name_plural = "Tags"
verbose_name = "Tag"

def __str__(self):
return self.name


class News(models.Model):
def get_poster_path(self, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return 'static/uploads/news/cover/' + filename

title = models.CharField(max_length=100)
slug = models.SlugField()
author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='news_author', blank=True, null=True)
pinned = models.BooleanField(default=False)
cover = ProcessedImageField(default='', verbose_name='News Poster', upload_to=get_poster_path, validators=[validate_file_size], **processed_image_field_specs)
date = models.DateField(default=date.today)
category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='category_author', blank=True, null=True)
tags = models.ManyToManyField(Tag, related_name='tags')
description = RichTextField(max_length=1000, null=True, blank=True)

class Meta:
verbose_name = "News"
verbose_name_plural = "News"

def __str__(self):
return self.title
79 changes: 79 additions & 0 deletions activity/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import graphene
from .models import *
from framework.api.user import UserBasicObj
from django.db.models import F


class CategoryObj(graphene.ObjectType):
name = graphene.String()
author = graphene.Field(UserBasicObj)

def resolve_name(self, info):
return self['name']

def resolve_author(self, info):
return User.objects.values().get(id=self['author_id'])


class TagObj(graphene.ObjectType):
name = graphene.String()

def resolve_name(self, info):
return self['name']


class NewsObj(graphene.ObjectType):
title = graphene.String(required=True)
slug = graphene.String(required=True)
author = graphene.Field(UserBasicObj)
date = graphene.Date(required=True)
category = graphene.Field(CategoryObj)
tags = graphene.List(TagObj)
pinned = graphene.Boolean()
description = graphene.String(required=True)

def resolve_title(self, info):
return self['title']

def resolve_slug(self, info):
return self['slug']

def resolve_author(self, info):
return User.objects.values().get(id=self['author_id'])

def resolve_date(self, info):
return self['date']

def resolve_pinned(self, info):
return self['pinned']

def resolve_category(self, info):
return Category.objects.values().get(id=self['category_id'])

@graphene.resolve_only_args
def resolve_tags(self):
return News.objects.values().annotate(
name=F('tags__name'),
).filter(id=self['id'])


class Query(graphene.ObjectType):
news = graphene.List(NewsObj, slug=graphene.String())
tags = graphene.List(TagObj)
categories = graphene.List(CategoryObj)

def resolve_news(self, info, **kwargs):
slug = kwargs.get('slug')
if slug is not None:
return News.objects.values().get(slug=slug)
else:
return News.objects.values().all()

def resolve_tags(self, info):
return Tag.objects.values().all()

def resolve_categories(self, info):
return Category.objects.values().all()


schema = graphene.Schema(query=Query)
2 changes: 2 additions & 0 deletions framework/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from graphene_django import DjangoObjectType

import attendance.schema
import activity.schema
from dairy.schema import Query as dairyQuery
from registration.schema import Mutation as registrationMutation, Query as registrationQuery
import tasks.schema
Expand Down Expand Up @@ -239,6 +240,7 @@ class Query(
attendance.schema.Query,
password.schema.Query,
tasks.schema.Query,
activity.schema.Query,
status.schema.Query,
graphene.ObjectType
):
Expand Down
1 change: 1 addition & 0 deletions framework/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
'import_export',
'members',
'attendance',
'activity',
'dairy',
'status.apps.StatusConfig',
'registration',
Expand Down

0 comments on commit cb1d1b0

Please sign in to comment.