コード例 #1
0
ファイル: views.py プロジェクト: pyarun/flink
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)
コード例 #2
0
ファイル: views.py プロジェクト: pyarun/flink
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:
コード例 #3
0
ファイル: views.py プロジェクト: pyarun/flink
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)
コード例 #4
0
ファイル: views.py プロジェクト: vinodc/flink
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)
コード例 #5
0
ファイル: views.py プロジェクト: vinodc/flink
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:
コード例 #6
0
ファイル: views.py プロジェクト: vinodc/flink
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)