128 lines
4.8 KiB
Python
128 lines
4.8 KiB
Python
import uuid
|
|
import re
|
|
|
|
import pkg_resources
|
|
|
|
from pyramid.response import FileResponse, Response
|
|
|
|
from pyramid.security import authenticated_userid
|
|
|
|
from pyramid.view import view_config
|
|
import transaction
|
|
|
|
from soter.models import DBSession
|
|
from soter.models.master import Album
|
|
from soter.models.validation_exception import TryCatchFunction, ValidationError
|
|
|
|
|
|
@view_config(route_name='album_list', permission='Albums')
|
|
@view_config(request_method='GET', route_name='album_id', permission='Albums')
|
|
@view_config(request_method='GET', route_name='album_id_view', permission='Albums')
|
|
@view_config(request_method='GET', route_name='album', permission='Albums')
|
|
def html(request):
|
|
package, resource = 'soter:static/index.html'.split(':', 1)
|
|
file = pkg_resources.resource_filename(package, resource)
|
|
return FileResponse(file, request=request)
|
|
|
|
|
|
@view_config(request_method='POST', route_name='api_album', renderer='json', permission='Albums')
|
|
@TryCatchFunction
|
|
def save(request):
|
|
item = Album(request.json_body['name'], request.json_body['description'],
|
|
user_id=uuid.UUID(authenticated_userid(request)), is_public=request.json_body['isPublic'])
|
|
DBSession.add(item)
|
|
transaction.commit()
|
|
return album_info(item.id)
|
|
|
|
|
|
@view_config(request_method='POST', route_name='api_album_id', renderer='json', permission='Albums')
|
|
@TryCatchFunction
|
|
def update(request):
|
|
p = re.compile('^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$')
|
|
id = request.matchdict['id']
|
|
if p.match(id):
|
|
item = Album.by_id(uuid.UUID(id))
|
|
else:
|
|
item = Album.by_semantic(id)
|
|
|
|
if item.is_fixture:
|
|
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
|
|
item.name = request.json_body['name']
|
|
item.description = request.json_body['description']
|
|
item.is_public = request.json_body['isPublic']
|
|
item.user_id = uuid.UUID(authenticated_userid(request))
|
|
transaction.commit()
|
|
return album_info(item.id)
|
|
|
|
|
|
@view_config(request_method='DELETE', route_name='api_album_id', renderer='json', permission='Albums')
|
|
def delete(request):
|
|
item = request.matchdict['id']
|
|
item = None if item is None else Album.by_id(item)
|
|
|
|
if item.is_fixture:
|
|
raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.name))
|
|
else:
|
|
response = Response("Cost Center deletion not implemented")
|
|
response.status_int = 500
|
|
return response
|
|
|
|
|
|
@view_config(request_method='GET', route_name='api_album_id', renderer='json', permission='Albums')
|
|
def show_id(request):
|
|
p = re.compile('^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$')
|
|
id = request.matchdict['id']
|
|
if p.match(id):
|
|
item = Album.by_id(uuid.UUID(id))
|
|
else:
|
|
item = Album.by_semantic(id)
|
|
return album_info(item)
|
|
|
|
|
|
@view_config(request_method='GET', route_name='api_album', renderer='json', permission='Albums')
|
|
def show_blank(request):
|
|
return album_info(None)
|
|
|
|
|
|
@view_config(request_method='GET', route_name='api_album', renderer='json', request_param='list',
|
|
permission='Authenticated')
|
|
def show_list(request):
|
|
list = Album.list()
|
|
albums = []
|
|
for item in list:
|
|
albums.append({'name': item.name, 'description': item.description, 'isPublic': item.is_public,
|
|
'user': item.user.name, 'isFixture': item.is_fixture, 'pictures': [],
|
|
'viewUrl': request.route_url('album_id_view', id=item.semantic, ),
|
|
'editUrl': request.route_url('album_id', id=item.semantic)})
|
|
return albums
|
|
|
|
|
|
@view_config(request_method='GET', route_name='api_album_id', renderer='json', request_param='pictures',
|
|
permission='Albums')
|
|
def show_pics(request):
|
|
id = request.matchdict['id']
|
|
p = re.compile('^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$')
|
|
if p.match(id):
|
|
album = Album.by_id(uuid.UUID(id))
|
|
else:
|
|
album = Album.by_semantic(id)
|
|
info = album_info(album)
|
|
for item in album.pictures:
|
|
info['pictures'].append({'name': item.name,
|
|
'url': request.route_url('picture_id', id=item.id, _query={'s': '1600x1200'}),
|
|
'imageUrl': request.route_url('picture_raw', size='242x200', id=item.id)})
|
|
return info
|
|
|
|
|
|
def album_info(id):
|
|
if id is None:
|
|
return {'name': "", 'description': "", 'isPublic': False, 'pictures': []}
|
|
if not isinstance(id, Album):
|
|
album = Album.by_id(id)
|
|
else:
|
|
album = id
|
|
album = {'id': album.id, 'name': album.name, 'description': album.description, 'isPublic': album.is_public,
|
|
'pictures': [], 'user': {'id': album.user_id, 'name': album.user.name},
|
|
'isFixture': album.is_fixture}
|
|
return album
|