def post(request): """Creates a tag object :param name: Name for tag :type name: str :returns: json """ res = Result() name = request.POST.get('name', None) if not name: res.isError = True res.message = "No name given" return JsonResponse(res) tag, created = Tag.objects.get_or_create(name=name) res.isSuccess = True if created: res.message = "Created" res.append(tag.json()) return JsonResponse(res)
def manage(request): if request.method == 'GET': guids = request.GET.get('guids', '').split(',') guids = filter(None, guids) objects = getObjectsFromGuids(guids) ids = [o.id for o in objects] imgtags = list( Tag.objects.filter(image__id__in=ids).exclude(artist=True)) vidtags = list( Tag.objects.filter(video__id__in=ids).exclude(artist=True)) tags = list(set(imgtags + vidtags)) if request.GET.get('json', False): res = Result() data = { 'queries': connection.queries, } res.value = data res.isSuccess = True return JsonResponse(res) return render(request, 'frog/tag_manage.html', {'tags': tags}) else: add = request.POST.get('add', '').split(',') rem = request.POST.get('rem', '').split(',') guids = request.POST.get('guids', '').split(',') add = filter(None, add) rem = filter(None, rem) addList = [] for t in add: try: addList.append(int(t)) except ValueError: tag, created = Tag.objects.get_or_create(name=t) tag.save() addList.append(tag.id) objects = getObjectsFromGuids(guids) addTags = Tag.objects.filter(id__in=addList) remTags = Tag.objects.filter(id__in=rem) for o in objects: for a in addTags: o.tags.add(a) for r in remTags: o.tags.remove(r) res = Result() res.isSuccess = True return JsonResponse(res)
def isUnique(request): path = request.GET.get('path', None) res = Result() if path: if request.user.is_anonymous(): username = request.GET.get('user', 'noauthor') user = User.objects.get(username=username) else: user = request.user uniqueID = Piece.getUniqueID(path, user) img = Image.objects.filter(unique_id=uniqueID) vid = Video.objects.filter(unique_id=uniqueID) if img: res.append(img[0].json()) elif vid: res.append(vid[0].json()) else: res.append(True) res.isSuccess = True else: res.isError = True res.message = "No path provided" return JsonResponse(res)
def post(request): """ Create a Gallery """ defaultname = 'New Gallery %i' % Gallery.objects.all().count() title = request.POST.get('title', defaultname) description = request.POST.get('description', '') security = int(request.POST.get('security', Gallery.PUBLIC)) parentid = request.POST.get('parent') if parentid: parent = Gallery.objects.get(pk=int(parentid)) g, created = parent.gallery_set.get_or_create(title=title) g.security = parent.security else: g, created = Gallery.objects.get_or_create(title=title) g.security = security g.description = description g.owner = request.user g.save() res = Result() res.isSuccess = True res.append(g.json()) res.message = 'Gallery created' if created else '' return JsonResponse(res)
def put(request, obj_id=None): """ Adds Image and Video objects to Gallery based on GUIDs """ guids = filter(None, request.PUT.get('guids', '').split(',')) security = request.PUT.get('security') object_ = Gallery.objects.get(pk=obj_id) if guids: objects = getObjectsFromGuids(guids) images = filter(lambda x: isinstance(x, Image), objects) videos = filter(lambda x: isinstance(x, Video), objects) object_.images.add(*images) object_.videos.add(*videos) if security is not None: object_.security = json.loads(security) object_.save() for child in object_.gallery_set.all(): child.security = object_.security child.save() res = Result() res.append(object_.json()) res.isSuccess = True return JsonResponse(res)
def search(request): """ Search for Tag objects and returns a Result object with a list of searialize Tag objects. :param search: Append a "Search for" tag :type search: bool :param zero: Exclude Tags with no items :type zero: bool :param artist: Exclude artist tags :type artist: bool :returns: json """ q = request.GET.get('q', '') includeSearch = request.GET.get('search', False) nonZero = request.GET.get('zero', False) excludeArtist = request.GET.get('artist', False) if includeSearch: l = [{'id': 0, 'name': 'Search for: %s' % q}] else: l = [] query = Tag.objects.filter(name__icontains=q) if excludeArtist: query = query.exclude(artist=True) if nonZero: l += [t.json() for t in query if t.count() > 0] else: l += [t.json() for t in query] return JsonResponse(l)
def filterObjects(request, obj_id): """ Filters Gallery for the requested ImageVideo objects. Returns a Result object with serialized objects """ print obj_id obj = Gallery.objects.get(pk=obj_id) if request.user.is_anonymous() and obj.security != Gallery.PUBLIC: res = Result() res.isError = True res.message = 'This gallery is not public' return JsonResponse(res) tags = json.loads(request.GET.get('filters', '[[]]')) rng = request.GET.get('rng', None) more = json.loads(request.GET.get('more', 'false')) models = request.GET.get('models', 'image,video') if models == '': models = 'image,video' tags = filter(None, tags) models = [ContentType.objects.get(app_label='frog', model=x) for x in models.split(',')] return _filter(request, obj, tags=tags, rng=rng, models=models, more=more)
def post(request): """Sets a key to a value on the currently logged in users preferences :param key: Key to set :type key: str :param val: Value to set :type val: primitive :returns: json """ key = request.POST.get('key', None) val = request.POST.get('val', None) res = Result() if key and val: obj, created = UserPref.objects.get_or_create(user=request.user) if created: obj.data = json.dumps(DefaultPrefs.copy()) obj.save() val = json.loads(val) obj.setKey(key, val) obj.save() res.append(obj.json()) res.isSuccess = True else: res.isError = True res.message = 'No key and value provided' return JsonResponse(res)
def get(request, obj_id=None): if obj_id: obj = Gallery.objects.get(pk=obj_id) if obj.security != Gallery.PUBLIC and request.user.is_anonymous(): return HttpResponseRedirect('frogaccess_denied') return render(request, 'frog/gallery.html', {'object': obj}) else: res = Result() res.isSuccess = True flat = bool(request.GET.get('flat')) if request.user.is_anonymous(): objects = Gallery.objects.filter(security=Gallery.PUBLIC) else: objects = Gallery.objects.filter(Q(security__lt=Gallery.PRIVATE) | Q(owner=request.user)) objects = objects.filter(parent__isnull=True) for n in objects: if flat: res.append({'title': n.title, 'id': n.id}); for child in n.gallery_set.all().order_by('title'): res.append({'title': '-- %s' % child.title, 'id': child.id}); else: res.append(n.json()) return JsonResponse(res)
def post(request): """Returns a serialized object :param obj_id: ID of comment object :type obj_id: int :returns: json """ guid = request.POST.get('guid', None) res = Result() if guid: obj = getObjectsFromGuids([ guid, ])[0] c = Comment() c.comment = request.POST.get('comment', 'No comment') c.user = request.user c.user_name = request.user.get_full_name() c.user_email = request.user.email c.content_object = obj c.site_id = 1 c.save() obj.comment_count = obj.comment_count + 1 obj.save() __email(c, obj) res.append({'id': c.id, 'comment': c.comment}) res.isSuccess = True else: res.isError = True res.message = "No guid provided" return JsonResponse(res)
def delete(self, request, obj): obj.deleted = True obj.save() res = Result() res.isSuccess = True res.value = obj.json() return JsonResponse(res)
def artistLookup(request): res = Result() query = request.GET.get('query', False) if query: users = User.objects.filter(first_name__icontains=query.lower()) else: users = User.objects.all() for user in users: res.append(userToJson(user)) return JsonResponse(res.values)
def get(request, obj_id): """Returns a serialized object :param obj_id: ID of comment object :type obj_id: int :returns: json """ res = Result() c = Comment.objects.get(pk=obj_id) res.append(commentToJson(c)) res.isSuccess = True return JsonResponse(res)
def get(request): """Gets the currently logged in users preferences :returns: json """ res = Result() obj, created = UserPref.objects.get_or_create(user=request.user) if created: obj.data = json.dumps(DefaultPrefs.copy()) obj.save() res.append(obj.json()) res.isSuccess = True return JsonResponse(res)
def getUser(request): res = Result() if request.user.is_anonymous(): res.isError = True res.append(DefaultPrefs) else: galleryid = request.GET.get('gallery') if galleryid is not None: gallery = Gallery.objects.filter(pk=galleryid, owner=request.user) if gallery: res.append(gallery[0].json()) res.isSuccess = True return JsonResponse(res)
def post(self, request, obj): tags = request.POST.get('tags', '').split(',') res = Result() for tag in tags: try: t = Tag.objects.get(pk=int(tag)) except ValueError: t, created = Tag.objects.get_or_create(name=tag) if created: res.append(t.json()) obj.tags.add(t) res.isSuccess = True return JsonResponse(res)
def delete(request, obj_id=None): """ Removes ImageVideo objects from Gallery """ guids = request.DELETE.get('guids', '').split(',') objects = getObjectsFromGuids(guids) object_ = Gallery.objects.get(pk=obj_id) for o in objects: if isinstance(o, Image): object_.images.remove(o) elif isinstance(o, Video): object_.videos.remove(o) res = Result() res.isSuccess = True return JsonResponse(res)
def get(request, obj_id=None): """Lists all tags :returns: json """ if obj_id: obj = get_object_or_404(Tag, pk=obj_id) return render(request, 'frog/tag.html', {'object': obj}) else: res = Result() res.isSuccess = True for n in Tag.objects.all(): res.append(n.json()) return JsonResponse(res)
def put(request): """Adds tags from objects resolved from guids :param tags: Tags to add :type tags: list :param guids: Guids to add tags from :type guids: list :returns: json """ tagList = filter(None, request.PUT.get('tags', '').split(',')) guids = request.PUT.get('guids', '').split(',') res = Result() res.isSuccess = True _manageTags(tagList, guids) return JsonResponse(res)
def delete(request): """Removes tags from objects resolved from guids :param tags: Tags to remove :type tags: list :param guids: Guids to remove tags from :type guids: list :returns: json """ tagList = filter(None, request.DELETE.get('tags', '').split(',')) guids = request.DELETE.get('guids', '').split(',') res = Result() res.isSuccess = True _manageTags(tagList, guids, add=False) return JsonResponse(res)
def put(request, obj_id): """Updates the content of a comment :param obj_id: ID of comment object :type obj_id: int :returns: json """ res = Result() c = Comment.objects.get(pk=obj_id) content = request.PUT.get('comment', None) if content: c.comment = content c.save() res.append(commentToJson(c)) res.isSuccess = True else: res.isError = True res.message = "No comment provided" return JsonResponse(res)
def switchArtist(request): artist = request.POST.get('artist', None) guids = request.POST.get('guids', '').split(',') res = Result() if artist: first, last = artist.lower().split(' ') author = User.objects.get_or_create(first_name=first, last_name=last, defaults={ 'username': '******' % (first[0], last), })[0] tag = Tag.objects.get_or_create(name=artist.lower(), defaults={'artist': True})[0] objects = getObjectsFromGuids(guids) for n in objects: n.author = author n.tagArtist(tag) res.isSuccess = True res.append(userToJson(author)) res.value['tag'] = Tag.objects.get(name=artist.lower()).id else: res.isError = True res.message = "No artist provided" return JsonResponse(res)
def _filter(request, object_, tags=None, models=(Image, Video), rng=None, more=False): """Filters Piece objects from self based on filters, search, and range :param tags: List of tag IDs to filter :type tags: list :param models: List of model classes to filter on :type models: list :param rng: Range of objects to return. i.e. 0:100 :type rng: str :param more -- bool, Returns more of the same filtered set of images based on session range return list, Objects filtered """ NOW = time.clock() res = Result() idDict = {} objDict = {} lastIDs = {} data = {} LOGGER.debug('init: %f' % (time.clock() - NOW)) if request.user.is_anonymous(): gRange = 300 else: Prefs = json.loads(UserPref.objects.get(user=request.user).data) gRange = Prefs['batchSize'] request.session.setdefault('frog_range', '0:%i' % gRange) if rng: s, e = [int(x) for x in rng.split(':')] else: if more: s = int(request.session.get('frog_range', '0:%i' % gRange).split(':')[1]) e = s + gRange s, e = 0, gRange else: s, e = 0, gRange ## -- Gat all IDs for each model for m in models: indexes = list(m.model_class().objects.all().values_list('id', flat=True)) if not indexes: continue lastIndex = indexes[0] if more: ## -- This is a request for more results idx = request.session.get('last_%s_id' % m.model, lastIndex + 1) lastIDs.setdefault('last_%s_id' % m.model, idx) else: lastIDs['last_%s_id' % m.model] = lastIndex + 1 ## -- Start with objects within range idDict[m.model] = m.model_class().objects.filter(gallery=object_, id__lt=lastIDs['last_%s_id' % m.model]) LOGGER.debug(m.model + '_initial_query: %f' % (time.clock() - NOW)) if tags: for bucket in tags: searchQuery = "" o = None for item in bucket: ## -- filter by tag if isinstance(item, int) or isinstance(item, long): if not o: o = Q() o |= Q(tags__id=item) ## -- add to search string else: searchQuery += item + ' ' if not HAYSTACK: if not o: o = Q() ## -- use a basic search LOGGER.debug('search From LIKE') o |= Q(title__icontains=item) if HAYSTACK and searchQuery != "": ## -- once all tags have been filtered, filter by search searchIDs = search(searchQuery, m.model_class()) if searchIDs: if not o: o = Q() LOGGER.debug('searchFrom haystack:' + str(searchIDs)) o |= Q(id__in=searchIDs) if o: ## -- apply the filters idDict[m.model] = idDict[m.model].filter(o) else: idDict[m.model] = idDict[m.model].none() LOGGER.debug(m.model + '_added_buckets(%i): %f' % (len(tags), time.clock() - NOW)) ## -- Get all ids of filtered objects, this will be a very fast query idDict[m.model] = list(idDict[m.model].values_list('id', flat=True)) LOGGER.debug(m.model + '_queried_ids: %f' % (time.clock() - NOW)) res.message = str(s) + ':' + str(e) ## -- perform the main query to retrieve the objects we want objDict[m.model] = m.model_class().objects.filter(id__in=idDict[m.model]).select_related('author').prefetch_related('tags') if not rng: objDict[m.model] = objDict[m.model][:gRange] objDict[m.model] = list(objDict[m.model]) LOGGER.debug(m.model + '_queried_obj: %f' % (time.clock() - NOW)) ## -- combine and sort all objects by date objects = _sortObjects(**objDict) if len(models) > 1 else objDict.values()[0] objects = objects[s:e] LOGGER.debug('sorted: %f' % (time.clock() - NOW)) ## -- serialize objects for i in objects: for m in models: if isinstance(i, m.model_class()): ## -- set the last ID per model for future lookups lastIDs['last_%s_id' % m.model] = i.id data['last_%s_id' % m.model] = i.id res.append(i.json()) LOGGER.debug('serialized: %f' % (time.clock() - NOW)) request.session['frog_range'] = ':'.join((str(s),str(e))) LOGGER.debug('total: %f' % (time.clock() - NOW)) request.session['last_image_id'] = lastIDs.get('last_image_id', 0) request.session['last_video_id'] = lastIDs.get('last_video_id', 0) data['count'] = len(objects) data['queries'] = connection.queries res.value = data res.isSuccess = True return JsonResponse(res)