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