def states_handler(request, blogger=None, posterboard=None, element=None, state=None, format='html'): user = request.user data = {"message": ""} if not user.id == blogger.id and user and blogger: return HttpResponseForbidden( 'Posterboard Only Available for Blogger to Edit') if posterboard is None or element is None: return HttpResponseBadRequest('Specify posterboard and element') if request.method == 'GET' and not request.GET.has_key('_action'): return HttpResponseBadRequest() # create elif request.method == 'POST' and not request.POST.has_key( '_action') and state is None: stateform = StateForm(request.POST, prefix='state') if stateform.is_valid(): state = stateform.save(commit=False) if state.order is None: try: max_order = State.objects.filter( pb_element=self.pb_element).aggregate( models.Max('order'))['order__max'] except: max_order = None if max_order is not None: self.order = max_order + 1 element.state_set.add(state) element.save() state.save() data['element-id'] = element.pk data['state-id'] = state.id if format == 'html': return redirect(posterboard) elif format == 'json': data['message'] = 'State created successfully.' data['state'] = jsonload(serializers.serialize( 'json', [state]))[0] return HttpResponse(json.dumps(data), mimetype='application/json') else: data['errors'] = 'State data isn\'t valid: ' + str( stateform.errors) #logger.debug('Errors creating Element: '+ data['errors']) return ErrorResponse(data['errors'], format) # destroy elif request.method == 'GET' and request.GET.has_key('_action') and request.GET['_action']=='delete' and \ element is not None and blogger.id == user.id and element.posterboard_id == posterboard.id and \ state is not None and state.pb_element_id == element.id: # Make sure element has more than one state. if element.state_set.count() <= 1: data['error'] = 'Cannot remove an element that has only one state' return ErrorResponse(data['error'], format) typestate = state.typestate() if typestate is not None: next_state = element.state_set.filter( order__gt=state.order).order_by('order', 'created_at')[0] typestate.state = next_state state.delete(delete_typestate=False) typestate.save() else: state.delete() data['message'] = 'Successfully removed state ' + str(state.id) if format == 'html': return redirect(posterboard) elif format == 'json': return HttpResponse(json.dumps(data), mimetype='application/json') # All other types of requests are invalid for this specific scenario. error = {'errors': 'Invalid request'} return ErrorResponse(error, format)
def posterboards_handler(request, blogger=None, posterboard=None, format='html'): user = request.user data = {} # Extra check for redundancy. This is already handled in the decorator. if blogger is None: #logger.info("Attempt to access PB without blogger o.O") return HttpResponseForbidden('Please specify a blogger first.') # index if request.method == 'GET' and not request.GET.has_key( '_action') and posterboard is None: if blogger.id == user.id: pbs = blogger.posterboard_set.filter(is_user_home_page=False).all() else: return redirect('/people/' + user.username) if format == 'html': return render_to_response('posterboards/index.html', { 'blogger': blogger, 'posterboards': pbs }, context_instance=RequestContext(request)) elif format == 'json': data['pb_ids'] = [] for pb in pbs: data['pb_ids'].append(pb.id) # Serialize object .. then get actual data structure out of serialized string return HttpResponse(data, mimetype='application/json') # show elif request.method == 'GET' and not request.GET.has_key( '_action') and posterboard is not None: if blogger.id != user.id and posterboard.private: return HttpResponseForbidden('Private Posterboard.') elif posterboard.is_user_home_page: return HttpResponseRedirect('/people/' + blogger.username + '/homepages/' + str(posterboard.id) + '/') preview = False if request.GET.has_key('preview') and request.GET['preview'] == 'true': preview = True data['converting'] = False element_data = [] for e in posterboard.element_set.all(): sset = e.state_set.all().order_by('order', 'created_at') state_data = [] typestate = None for s in sset: ts = None if s is not None: type = e.type try: if type == 'image': ts = s.imagestate elif type == 'audio': ts = s.audiostate elif type == 'video': ts = s.videostate if (ts.original_video.name[-3:] != 'ogv' and ts.original_video.name[-3:] != 'ogg' and (datetime.now() - ts.created_at).seconds < settings.CONVERSION_TIME): # Don't want to display the video before conversion safely over. data['converting'] = True continue elif type == 'text': ts = s.textstate ts.content = escape(strip(ts.content)) except: pass state_data += (jsonload(serializers.serialize('json', [s]))) if ts is not None: typestate = ts #else: # logger.debug(u"Can't get type state for type %s" % type) #if settings.DEBUG: # logger.info("\nSerializing: "+ str(s.__dict__) + str(e.__dict__) + str(ts.__dict__)) # logger.info("\nSerialized: "+ serializers.serialize('json', [e, s, ts])) if typestate is not None: element_data.append( jsonload(serializers.serialize('json', [e, typestate])) + [state_data]) data['element_data'] = element_data #if settings.DEBUG: # logger.info("\nElement data: "+ str(element_data)) #logger.debug('Element data passed to posterboard/show: '+ str(data['element_data'])) #logger.debug('a random field: ' + data['element_data'][0][0]['fields']['type']) linked = True try: posterboard.imagestate except: linked = False if format == 'html': return render_to_response( 'posterboards/show.html', { 'blogger': blogger, 'posterboard': posterboard, 'linked': linked, 'converting': data['converting'], 'element_data': data['element_data'], 'blog_owner': (blogger.id == user.id) and not preview }, context_instance=RequestContext(request)) elif format == 'json': return HttpResponse(json.dumps(data), mimetype='application/json') # create, make sure to check user.id as only logged in user can create new posterboard elif user.id and request.method == 'POST': pbForm = PosterboardForm(request.POST, initial={'title': 'userhomepage'}) if (not pbForm.data.has_key('title') ) or pbForm.data['title'] is None or pbForm.data['title'] == '': pbForm.data = pbForm.data.copy() pbForm.data['title'] = 'userhomepage' if pbForm.is_valid(): # commit=False creates and returns the model object but doesn't save it. # Remove it if unnecessary. posterboard = pbForm.save(commit=False) try: posterboard.user = user posterboard.full_clean() posterboard.save() except ValidationError, e: return ErrorResponse(str(e), format) except IntegrityError, e: return ErrorResponse(str(e), format) except:
def people_handler(request, blogger=None, homepageid=None, format='html', settings=None): user = request.user # GET request with no specific user, so what is needed is a list of users. if request.method == 'GET' and blogger is None: bloggers = User.objects.filter(is_superuser__exact=False) data = { 'bloggers': map( lambda b: { 'first_name': b.first_name, 'last_name': b.last_name, 'username': b.username, 'full_name': b.get_full_name() }, bloggers) } if format == 'html': return render_to_response('people/index.html', data, context_instance=RequestContext(request)) elif format == 'json': return HttpResponse(json.dumps(data), mimetype='application/json') # GET request with a specific user, so show that user's blog. elif request.method == 'GET' and not request.GET.has_key( '_action') and blogger is not None: data = { 'blogger': { 'first_name': blogger.first_name, 'last_name': blogger.last_name, 'username': blogger.username, 'full_name': blogger.get_full_name() }, 'settings': { 'grid_size': settings.grid_size, 'blog_title': settings.blog_title }, } if blogger.id == user.id: pbs = blogger.posterboard_set linkedpbs = blogger.posterboard_set.filter( is_user_home_page=False).all() else: pbs = blogger.posterboard_set.filter(private=False) pbs = pbs.filter(is_user_home_page=True).order_by('-created_at').all() nexthomepage = False prevhomepage = False if len(pbs) < 1: # Not a single homepage?! Create one. posterboard = Posterboard() posterboard.user = blogger posterboard.title = "userhomepage" posterboard.is_user_home_page = True posterboard.full_clean() posterboard.save() elif homepageid is None: posterboard = pbs[0] if len(pbs) > 1: prevhomepage = pbs[1] else: # This isn't really the posterboad, it's an array # that should have it as the only element. # So it is [<posterboard>], not <posterboard> posterboard = pbs.filter(id=homepageid) if len(posterboard) == 0: posterboard = pbs[0] if len(pbs) > 1: prevhomepage = pbs[1] else: posterboard = posterboard[0] for i in range(0, len(pbs)): if pbs[i].id == posterboard.id: if i > 0: nexthomepage = pbs[i - 1] if i < len(pbs) - 1: prevhomepage = pbs[i + 1] element_data = [] for e in posterboard.element_set.all(): sset = e.state_set.all().order_by('order', 'created_at') sset = list(sset[:1]) s = None if sset: s = sset[0] ts = None if s is not None: type = e.type if type == 'image': ts = s.imagestate p = ts.linkedposterboard #else: # logger.debug(u"Can't get type state for type %s" % type) element_data.append( jsonload(serializers.serialize('json', [e, ts])) + [jsonload(serializers.serialize('json', [s]))] + jsonload(serializers.serialize('json', [p]))) data['element_data'] = element_data #logger.debug('Element data passed to posterboard/show: '+ str(data['element_data'])) #logger.debug('a random field: ' + data['element_data'][0][0]['fields']['type']) unlinked_pbs = blogger.posterboard_set.filter( is_user_home_page=False, imagestate__linkedposterboard=None) unlinked_pbs = unlinked_pbs.order_by('-created_at') # TODO: pbs is an array of posterboards. if format == 'html': return render_to_response('people/show.html', { 'blogger': blogger, 'userhomepages': pbs, 'nexthomepage': nexthomepage, 'prevhomepage': prevhomepage, 'posterboard': posterboard, 'linkedpbs': linkedpbs, 'unlinkedposterboards': unlinked_pbs, 'element_data': data['element_data'], 'blog_owner': blogger.id == user.id }, context_instance=RequestContext(request)) elif format == 'json': return HttpResponse(json.dumps(data), mimetype='application/json') # DELETE request, to delete that specific blog and user. Error for now. elif request.method == 'GET' and request.GET.has_key('_action') and request.GET['_action']=='delete' \ and blogger is not None and (blogger.id == user.id and blogger.username == user.username): # Trying to delete themselves? Not handling it for now. data = { 'blogger': { 'username': blogger.username, 'full_name': blogger.get_full_name() }, 'errors': 'User deletion not supported this way.' } return ErrorResponse(data, format) # All other types of requests are invalid for this specific scenario. error = {'errors': 'Invalid request'} return ErrorResponse(error, format)
def states_handler(request, blogger=None, posterboard=None, element=None, state=None, format="html"): user = request.user data = {"message": ""} if not user.id == blogger.id and user and blogger: return HttpResponseForbidden("Posterboard Only Available for Blogger to Edit") if posterboard is None or element is None: return HttpResponseBadRequest("Specify posterboard and element") if request.method == "GET" and not request.GET.has_key("_action"): return HttpResponseBadRequest() # create elif request.method == "POST" and not request.POST.has_key("_action") and state is None: stateform = StateForm(request.POST, prefix="state") if stateform.is_valid(): state = stateform.save(commit=False) if state.order is None: try: max_order = State.objects.filter(pb_element=self.pb_element).aggregate(models.Max("order"))[ "order__max" ] except: max_order = None if max_order is not None: self.order = max_order + 1 element.state_set.add(state) element.save() state.save() data["element-id"] = element.pk data["state-id"] = state.id if format == "html": return redirect(posterboard) elif format == "json": data["message"] = "State created successfully." data["state"] = jsonload(serializers.serialize("json", [state]))[0] return HttpResponse(json.dumps(data), mimetype="application/json") else: data["errors"] = "State data isn't valid: " + str(stateform.errors) # logger.debug('Errors creating Element: '+ data['errors']) return ErrorResponse(data["errors"], format) # destroy elif ( request.method == "GET" and request.GET.has_key("_action") and request.GET["_action"] == "delete" and element is not None and blogger.id == user.id and element.posterboard_id == posterboard.id and state is not None and state.pb_element_id == element.id ): # Make sure element has more than one state. if element.state_set.count() <= 1: data["error"] = "Cannot remove an element that has only one state" return ErrorResponse(data["error"], format) typestate = state.typestate() if typestate is not None: next_state = element.state_set.filter(order__gt=state.order).order_by("order", "created_at")[0] typestate.state = next_state state.delete(delete_typestate=False) typestate.save() else: state.delete() data["message"] = "Successfully removed state " + str(state.id) if format == "html": return redirect(posterboard) elif format == "json": return HttpResponse(json.dumps(data), mimetype="application/json") # All other types of requests are invalid for this specific scenario. error = {"errors": "Invalid request"} return ErrorResponse(error, format)
def posterboards_handler(request, blogger=None, posterboard=None, format="html"): user = request.user data = {} # Extra check for redundancy. This is already handled in the decorator. if blogger is None: # logger.info("Attempt to access PB without blogger o.O") return HttpResponseForbidden("Please specify a blogger first.") # index if request.method == "GET" and not request.GET.has_key("_action") and posterboard is None: if blogger.id == user.id: pbs = blogger.posterboard_set.filter(is_user_home_page=False).all() else: return redirect("/people/" + user.username) if format == "html": return render_to_response( "posterboards/index.html", {"blogger": blogger, "posterboards": pbs}, context_instance=RequestContext(request), ) elif format == "json": data["pb_ids"] = [] for pb in pbs: data["pb_ids"].append(pb.id) # Serialize object .. then get actual data structure out of serialized string return HttpResponse(data, mimetype="application/json") # show elif request.method == "GET" and not request.GET.has_key("_action") and posterboard is not None: if blogger.id != user.id and posterboard.private: return HttpResponseForbidden("Private Posterboard.") elif posterboard.is_user_home_page: return HttpResponseRedirect("/people/" + blogger.username + "/homepages/" + str(posterboard.id) + "/") preview = False if request.GET.has_key("preview") and request.GET["preview"] == "true": preview = True data["converting"] = False element_data = [] for e in posterboard.element_set.all(): sset = e.state_set.all().order_by("order", "created_at") state_data = [] typestate = None for s in sset: ts = None if s is not None: type = e.type try: if type == "image": ts = s.imagestate elif type == "audio": ts = s.audiostate elif type == "video": ts = s.videostate if ( ts.original_video.name[-3:] != "ogv" and ts.original_video.name[-3:] != "ogg" and (datetime.now() - ts.created_at).seconds < settings.CONVERSION_TIME ): # Don't want to display the video before conversion safely over. data["converting"] = True continue elif type == "text": ts = s.textstate ts.content = escape(strip(ts.content)) except: pass state_data += jsonload(serializers.serialize("json", [s])) if ts is not None: typestate = ts # else: # logger.debug(u"Can't get type state for type %s" % type) # if settings.DEBUG: # logger.info("\nSerializing: "+ str(s.__dict__) + str(e.__dict__) + str(ts.__dict__)) # logger.info("\nSerialized: "+ serializers.serialize('json', [e, s, ts])) if typestate is not None: element_data.append(jsonload(serializers.serialize("json", [e, typestate])) + [state_data]) data["element_data"] = element_data # if settings.DEBUG: # logger.info("\nElement data: "+ str(element_data)) # logger.debug('Element data passed to posterboard/show: '+ str(data['element_data'])) # logger.debug('a random field: ' + data['element_data'][0][0]['fields']['type']) linked = True try: posterboard.imagestate except: linked = False if format == "html": return render_to_response( "posterboards/show.html", { "blogger": blogger, "posterboard": posterboard, "linked": linked, "converting": data["converting"], "element_data": data["element_data"], "blog_owner": (blogger.id == user.id) and not preview, }, context_instance=RequestContext(request), ) elif format == "json": return HttpResponse(json.dumps(data), mimetype="application/json") # create, make sure to check user.id as only logged in user can create new posterboard elif user.id and request.method == "POST": pbForm = PosterboardForm(request.POST, initial={"title": "userhomepage"}) if (not pbForm.data.has_key("title")) or pbForm.data["title"] is None or pbForm.data["title"] == "": pbForm.data = pbForm.data.copy() pbForm.data["title"] = "userhomepage" if pbForm.is_valid(): # commit=False creates and returns the model object but doesn't save it. # Remove it if unnecessary. posterboard = pbForm.save(commit=False) try: posterboard.user = user posterboard.full_clean() posterboard.save() except ValidationError, e: return ErrorResponse(str(e), format) except IntegrityError, e: return ErrorResponse(str(e), format) except:
def people_handler(request, blogger=None, homepageid=None, format="html", settings=None): user = request.user # GET request with no specific user, so what is needed is a list of users. if request.method == "GET" and blogger is None: bloggers = User.objects.filter(is_superuser__exact=False) data = { "bloggers": map( lambda b: { "first_name": b.first_name, "last_name": b.last_name, "username": b.username, "full_name": b.get_full_name(), }, bloggers, ) } if format == "html": return render_to_response("people/index.html", data, context_instance=RequestContext(request)) elif format == "json": return HttpResponse(json.dumps(data), mimetype="application/json") # GET request with a specific user, so show that user's blog. elif request.method == "GET" and not request.GET.has_key("_action") and blogger is not None: data = { "blogger": { "first_name": blogger.first_name, "last_name": blogger.last_name, "username": blogger.username, "full_name": blogger.get_full_name(), }, "settings": {"grid_size": settings.grid_size, "blog_title": settings.blog_title}, } if blogger.id == user.id: pbs = blogger.posterboard_set linkedpbs = blogger.posterboard_set.filter(is_user_home_page=False).all() else: pbs = blogger.posterboard_set.filter(private=False) pbs = pbs.filter(is_user_home_page=True).order_by("-created_at").all() nexthomepage = False prevhomepage = False if len(pbs) < 1: # Not a single homepage?! Create one. posterboard = Posterboard() posterboard.user = blogger posterboard.title = "userhomepage" posterboard.is_user_home_page = True posterboard.full_clean() posterboard.save() elif homepageid is None: posterboard = pbs[0] if len(pbs) > 1: prevhomepage = pbs[1] else: # This isn't really the posterboad, it's an array # that should have it as the only element. # So it is [<posterboard>], not <posterboard> posterboard = pbs.filter(id=homepageid) if len(posterboard) == 0: posterboard = pbs[0] if len(pbs) > 1: prevhomepage = pbs[1] else: posterboard = posterboard[0] for i in range(0, len(pbs)): if pbs[i].id == posterboard.id: if i > 0: nexthomepage = pbs[i - 1] if i < len(pbs) - 1: prevhomepage = pbs[i + 1] element_data = [] for e in posterboard.element_set.all(): sset = e.state_set.all().order_by("order", "created_at") sset = list(sset[:1]) s = None if sset: s = sset[0] ts = None if s is not None: type = e.type if type == "image": ts = s.imagestate p = ts.linkedposterboard # else: # logger.debug(u"Can't get type state for type %s" % type) element_data.append( jsonload(serializers.serialize("json", [e, ts])) + [jsonload(serializers.serialize("json", [s]))] + jsonload(serializers.serialize("json", [p])) ) data["element_data"] = element_data # logger.debug('Element data passed to posterboard/show: '+ str(data['element_data'])) # logger.debug('a random field: ' + data['element_data'][0][0]['fields']['type']) unlinked_pbs = blogger.posterboard_set.filter(is_user_home_page=False, imagestate__linkedposterboard=None) unlinked_pbs = unlinked_pbs.order_by("-created_at") # TODO: pbs is an array of posterboards. if format == "html": return render_to_response( "people/show.html", { "blogger": blogger, "userhomepages": pbs, "nexthomepage": nexthomepage, "prevhomepage": prevhomepage, "posterboard": posterboard, "linkedpbs": linkedpbs, "unlinkedposterboards": unlinked_pbs, "element_data": data["element_data"], "blog_owner": blogger.id == user.id, }, context_instance=RequestContext(request), ) elif format == "json": return HttpResponse(json.dumps(data), mimetype="application/json") # DELETE request, to delete that specific blog and user. Error for now. elif ( request.method == "GET" and request.GET.has_key("_action") and request.GET["_action"] == "delete" and blogger is not None and (blogger.id == user.id and blogger.username == user.username) ): # Trying to delete themselves? Not handling it for now. data = { "blogger": {"username": blogger.username, "full_name": blogger.get_full_name()}, "errors": "User deletion not supported this way.", } return ErrorResponse(data, format) # All other types of requests are invalid for this specific scenario. error = {"errors": "Invalid request"} return ErrorResponse(error, format)