Skip to content

Commit

Permalink
gallery: Add albums, photos APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
harshithpabbati committed Jun 22, 2020
1 parent 5c32964 commit 8fdc9a7
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 36 deletions.
62 changes: 32 additions & 30 deletions framework/schema.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,39 @@
import secrets
import string
from datetime import datetime, timedelta

import graphene
import graphql_jwt
from datetime import date, datetime, timedelta

from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import check_password
from django.utils import timezone
from graphql_jwt.decorators import permission_required, login_required
from django.contrib.auth.models import User
from django.core.mail import send_mail
from django.db.models import Avg
from django.contrib.auth import get_user_model
from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.html import strip_tags
from graphene_django import DjangoObjectType
from graphql_jwt.decorators import login_required

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
import status.schema
import attendance.schema
import password.schema
from .api.APIException import APIException
import status.schema
import tasks.schema
import gallery.schema
from attendance.api.log import userAttendanceObj
from attendance.models import Log
from dairy.schema import Mutation as eventMutation

from members.schema import Query as MembersQuery, Mutation as membersMutation
from members.api.profile import ProfileObj
from dairy.schema import Query as dairyQuery
from framework import settings
from members.api.group import GroupObj
from members.api.profile import ProfileObj
from members.models import Profile, Group

from attendance.models import Log
from attendance.api.log import userAttendanceObj

from .api.user import UserBasicObj
from members.schema import Query as MembersQuery, Mutation as membersMutation
from registration.schema import Mutation as registrationMutation, Query as registrationQuery
from .api.APIException import APIException
from .api.mutation import Mutation as PlatformMutation

import secrets,string

from framework import settings
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from .api.user import UserBasicObj

from_email = settings.EMAIL_HOST_USER

Expand Down Expand Up @@ -210,6 +207,7 @@ def mutate(self, info, username=None, firstName=None, lastName=None, email=None,
profile.save()
return userResponseObj(id=user.id)


class ResetPassword(graphene.Mutation):
class Arguments:
email = graphene.String(required=True)
Expand All @@ -223,16 +221,18 @@ def mutate(self, info, email):
user.set_password(newPassword)
user.save()
context = {
"password" : newPassword,
"username" : user.username
"password": newPassword,
"username": user.username
}
message = render_to_string('email/password_reset_email.html', context)
send_mail('Reset Password | amFOSS CMS', strip_tags(message) , from_email, [email], fail_silently=False, html_message=message)
send_mail('Reset Password | amFOSS CMS', strip_tags(message), from_email, [email], fail_silently=False,
html_message=message)
return userStatusObj(status=True)
else:
raise APIException('Email is not registered',
code='WRONG_EMAIL')


class Query(
dairyQuery,
MembersQuery,
Expand All @@ -242,6 +242,7 @@ class Query(
tasks.schema.Query,
activity.schema.Query,
status.schema.Query,
gallery.schema.Query,
graphene.ObjectType
):
user = graphene.Field(UserObj, username=graphene.String(required=True))
Expand Down Expand Up @@ -294,7 +295,8 @@ def resolve_inActiveUsers(self, info, **kwargs):
code='ONLY_SUPERUSER_HAS_ACCESS')


class Mutation(membersMutation, attendance.schema.Mutation, registrationMutation, eventMutation, PlatformMutation, graphene.ObjectType):
class Mutation(membersMutation, attendance.schema.Mutation, registrationMutation, eventMutation, PlatformMutation,
graphene.ObjectType):
token_auth = graphql_jwt.ObtainJSONWebToken.Field()
verify_token = graphql_jwt.Verify.Field()
refresh_token = graphql_jwt.Refresh.Field()
Expand Down
9 changes: 5 additions & 4 deletions gallery/admin.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
from django.contrib import admin
from .models import *
from easy_select2 import select2_modelform
from import_export.admin import ImportExportModelAdmin, ExportActionMixin


@admin.register(Photo)
class PhotoAdmin(admin.ModelAdmin):
class PhotoAdmin(ImportExportModelAdmin, ExportActionMixin, admin.ModelAdmin):
fields = [
('uploader', 'date'),
'image',
'caption'
]
list_display = ('image', 'uploader', 'date')
list_display = ('caption', 'uploader', 'date')
list_filter = ['date']
search_fields = ['uploader']
select2 = select2_modelform(Photo, attrs={'width': '250px'})
form = select2


@admin.register(Album)
class AlbumAdmin(admin.ModelAdmin):
class AlbumAdmin(ImportExportModelAdmin, ExportActionMixin, admin.ModelAdmin):
fields = [
'title',
('uploader', 'date'),
Expand All @@ -27,6 +28,6 @@ class AlbumAdmin(admin.ModelAdmin):
]
list_display = ('title', 'uploader', 'date')
list_filter = ('date',)
search_fields = ['uploader',]
search_fields = ['uploader']
select2 = select2_modelform(Album, attrs={'width': '250px'})
form = select2
4 changes: 2 additions & 2 deletions gallery/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ def get_gallery_path(self, filename):

uploader = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(default=date.today)
image = ProcessedImageField(default='', verbose_name='Image', upload_to=get_gallery_path,validators=[validate_file_size], **processed_image_field_specs)
image = ProcessedImageField(default='', verbose_name='Image', upload_to=get_gallery_path, validators=[validate_file_size], **processed_image_field_specs)
caption = models.CharField(max_length=200, null=True, blank=True)

def __str__(self):
return str(self.id) + str(self.uploader.username) + str(self.date)
return self.caption

class Meta:
verbose_name_plural = "Photos"
Expand Down
86 changes: 86 additions & 0 deletions gallery/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import graphene
from gallery.models import *
from framework.api.user import UserBasicObj
from django.db.models import F
from framework.api.APIException import APIException


class PhotoObj(graphene.ObjectType):
caption = graphene.String()
image = graphene.String()
uploader = graphene.Field(UserBasicObj)
date = graphene.Date()

def resolve_caption(self, info):
return self['caption']

def resolve_image(self, info):
return self['image']

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

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


class AlbumObj(graphene.ObjectType):
title = graphene.String()
uploader = graphene.Field(UserBasicObj)
date = graphene.Date()
description = graphene.String()
photos = graphene.List(PhotoObj)

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

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

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

def resolve_description(self, info):
return self['description']

@graphene.resolve_only_args
def resolve_photos(self):
return Album.objects.values().annotate(
caption=F('photos__caption'),
image=F('photos__image'),
date=F('photos__date'),
uploader=F('photos__uploader')
).filter(id=self['id'])


class Query(graphene.ObjectType):
photos = graphene.List(PhotoObj)
photo = graphene.Field(PhotoObj, caption=graphene.String())
albums = graphene.List(AlbumObj)
album = graphene.Field(AlbumObj, title=graphene.String())

def resolve_photos(self, info):
return reversed(Photo.objects.values().all().order_by('date'))

def resolve_photo(self, info, **kwargs):
caption = kwargs.get('caption')
if caption is not None:
return Photo.objects.values().get(caption=caption)
else:
raise APIException('Caption is required',
code='CAPTION_IS_REQUIRED')

def resolve_albums(self, info):
return Album.objects.values().all().order_by('date')

def resolve_album(self, info, **kwargs):
title = kwargs.get('title')
if title is not None:
return Album.objects.values().get(title=title)
else:
raise APIException('Title is required',
code='TITLE_IS_REQUIRED')


schema = graphene.Schema(query=Query)

0 comments on commit 8fdc9a7

Please sign in to comment.