Пример #1
0
    def render(self, context):
        
        action_instance = self.action.resolve(context)
        request = context['request']

        actor               = action_instance.actor
        target              = action_instance.target
        target_content_type = action_instance.target_content_type

        ct_review  = ContentType.objects.get_for_model(Review)
        ct_mission = ContentType.objects.get_for_model(Mission)
        ct_post    = ContentType.objects.get_for_model(Post)
        ct_event   = ContentType.objects.get_for_model(Event)
        
        icon_group = None
        
        #=======================================================================
        # if the request user doesn't have permission to see this target, 
        # then return nothing
        #=======================================================================
        if hasattr(target, 'viewable_by'):
            if not target.viewable_by( request.user ):
                return ""

        #The following block is temporary used for excluding all mission group instances on user's wall
        if target == ContentType.objects.get_for_model( MissionGroup ).model:
            pps = None
            try:
                action_output = render_to_string(('activity/%(verb)s/action.html' % { 'verb':action_instance.verb.replace(' ','_') }),{ 'action':action_instance, 'pps':pps },context)
            except TemplateDoesNotExist:
                action_output = render_to_string(('activity/action.html'),{ 'action':action_instance, 'pps':pps },context)
            if self.varname is not None:
                context[self.varname] = action_output
                return ""
            else:
                return action_output

        #===========================================================================
        # arrange the parameters required by the inc_post_boilerplate.html
        #===========================================================================
        comment_target = target
        allow_comment = '1'
        
        avatar = actor.get_profile()
        
        if not avatar.public_comments:
            allow_comment="0"

        user_profile = avatar

        post_time = action_instance.timestamp

        #=======================================================================
        # Event
        #=======================================================================
        if target_content_type == ct_event:
            invitation = action_instance.target.get_invitation(request.user)
            if invitation:
                return render_to_string(('activity/event.html'),{ 'event': action_instance.target, 'invitation':invitation, 'request':request},context)
            else:
                return ""
            
        #=======================================================================
        # Review
        #=======================================================================
        if target_content_type == ct_review:
            #===================================================================
            # Review for Task Completion
            #===================================================================
            if target.task:
                task = target.task
                mission = task.mission
                pre_content_object = DummyMissionTask( mission, task )
                post_content_object = None
                todo_target = target.restaurant
            #===================================================================
            # Normal Review
            #===================================================================
            else:
                if hasattr(target, 'dish') and target.dish:
                    pre_content_object = target.dish
                    post_content_object = target.restaurant
                    todo_target = target.dish
                else:
                    pre_content_object = target.restaurant
                    post_content_object = None
                    todo_target = target.restaurant
            
            icon_group = target.score
            
            #content    
            if hasattr(target, 'content') and target.content:
                content = target.content
            else:
                content = None
              
            target_absolute_url="/restaurant/%s/photo_detail/%s/" % (target.restaurant.id, target.photo.id)
        #=======================================================================
        # Created Mission
        #=======================================================================
        elif target_content_type == ct_mission:
            pre_content_object = DummyMission( target )
            post_content_object = None
            
            content=target.description
            
            todo_target = target
            target_absolute_url = None
        
        #=======================================================================
        # Wall Post
        #=======================================================================
        elif target_content_type == ct_post:
            pre_content_object = None 
            post_content_object = None
            todo_target = None
            target_absolute_url = None
            content = target.content
            
            tag_list = target.get_all_tags_list()
            
        else:
            raise Exception("invlid type")
            

        
        if not target_content_type == ct_post:
            tag_list = None
        
        if target_content_type == ct_post:
            target_photo = target.get_photos()
        else:
            target_photo = [target.get_display_photo()]
        target_content_type_id = ContentType.objects.get_for_model(comment_target).id
        
        
        pps = gen_a_post(
            allow_comment=allow_comment,
            avatar=avatar,
        	user_profile=user_profile,
            pre_content_object=pre_content_object,
            post_content_object=post_content_object,
            content=content,
            post_time=post_time,
            todo_target=todo_target,
            target_photo=target_photo,
            target_absolute_url=target_absolute_url,
            target_content_type_id=target_content_type_id,
            comment_target=comment_target,
            request=request,
            tag_list = tag_list,
            icon_group = icon_group,
            action = action_instance,
		)
        
        try:
            action_output = render_to_string(('activity/%(verb)s/action.html' % { 'verb':action_instance.verb.replace(' ','_') }),{ 'action':action_instance, 'pps':pps },context)
        except TemplateDoesNotExist:
            action_output = render_to_string(('activity/action.html'),{ 'action':action_instance, 'pps':pps },context)
        if self.varname is not None:
            context[self.varname] = action_output
            return ""
        else:
            return action_output        
Пример #2
0
Файл: ajax.py Проект: gage/proto
def get_photo_detail( request, object_id=None, photo_id=None, event_id=None, photo_detail_type=None, is_render_to_string=False ):
    # time_start = datetime.now()
    
    ct_event = ContentType.objects.get_for_model(Event)
    ct_review = ContentType.objects.get_for_model(Review)
    user = request.user
    
    if not photo_id or not photo_detail_type:
        photo_id = request.POST['photo_id']
        photo_detail_type = request.POST['photo_detail_type']
    
    #from view
    if event_id:
        # only place and user profile have event photos
        object_id = event_id
    else:
        # from view
        if object_id:
            pass
        # from ajax
        else: 
            object_id = request.POST.get('object_id', None)
    
    photo = Photo.objects.get(pk=photo_id)
    photo_owner = photo.user
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)
    # print "Stage 0.5: %d" % time_elapsed

    # if not p_photo.viewable_by(user):
    #     raise Exception("You don't have permission to see this photo.")
    #     if is_render_to_string:
    #         raise Exception("You don't have permission to see this photo.")
    #     else:
    #         raise Exception("You don't have permission to see this photo.")
    # 
    # if user.is_anonymous():
    #     raise Exception('you are not a site user')
    
    # time_start = time_end
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 1: %d" % time_elapsed
    
    #===========================================================================
    # special case for the view of event photo detail page 
    #===========================================================================
    if photo.content_type == ct_event:
        photo_detail_type = PhotoDetailType.EVENT_PHOTO
        object_id = photo.object_id
        url_4_html5 = reverse('event-photo-detail', args=[object_id, photo.id])
         
    if photo_detail_type == PhotoDetailType.PLACE_PHOTO:
        photos = Photo.viewables(user).filter( place=photo.place.id ).exclude(content_type=ct_event).order_by('-created')
        url_4_html5 = reverse('place-photo-detail', args=[photo.place.id, photo.id]).replace('None', '')
    
    elif photo_detail_type == PhotoDetailType.PLACE_REVIEW:
        photos = Photo.viewables(user).filter( place=photo.place.id, content_type=ct_review ).order_by('-created')
        url_4_html5 = reverse('place-review-detail', args=[photo.place.id, photo.id])
    
    elif photo_detail_type == PhotoDetailType.DISH_REVIEW:
        photos = Photo.viewables(user).filter( dish=photo.dish.id, content_type=ct_review ).order_by('-created')
        url_4_html5 = reverse('dish-review-detail', args=[photo.dish.id, photo.id])
    
    elif photo_detail_type == PhotoDetailType.USER_PHOTO:
        photos = Photo.viewables(user).filter( user=photo_owner, content_type=ct_review).order_by('-created')
        url_4_html5 = reverse('userprofile-photo-detail', args=[photo_owner.id, photo.id]).replace('None', '')
    
    elif photo_detail_type == PhotoDetailType.EVENT_PHOTO:
        event = Event.objects.get(pk=object_id)
        photos = Photo.viewables(user).filter(object_id=event.id).order_by('-created')
        url_4_html5 = reverse('userprofile-photo-detail', args=[photo_owner.id, photo.id])
    else:
        raise Http404
    
#    print "photo_detail_type: %s" % photo_detail_type
    
    
    #===========================================================================
    # keep photo sequence into session 
    #===========================================================================
    
    #ppdl is acronym of Privacy Photo Detail List 
    ppdl = request.session.get('ppdl', [] )
    
    def create_session():
        request.session['ppdl'] = list(photos)
        request.session['ppdl_created'] = datetime.utcnow()  
        request.session['ppdl_type'] = photo_detail_type
        
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 2: %d" % time_elapsed
    # save ppdl in session at the first time user access a detail page
    if not ppdl:
        create_session()
    else:
        # ppdl = request.session['ppdl']
        ppdl_created = request.session['ppdl_created']
        ppdl_type = request.session['ppdl_type']
        elapsed_time = datetime.utcnow() - ppdl_created
        
        #======================================================================
        # modify session if 
        # photo detail type is not the same as the last time user access
        # or
        # the ppdl session has expired (life cycle: 30 mins)
        #======================================================================
        if ppdl_type != photo_detail_type or elapsed_time.seconds > 30*60:
#            print "modify session: case I"
            create_session()
        # modify session if p_photos has been changed
        elif len(ppdl) != photos.count():
#            print "modify session: case II"
            create_session()
        # modify session due to some cases of event photo
        else:
            if photo not in ppdl:
                create_session()
#                print "modify session: case III"
            else:
#                print "access session"
                pass
            
    ppdl = request.session['ppdl']
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 2.5: %d" % time_elapsed
    
    total = len(ppdl)


    #===========================================================================
    # handle photo display sequence
    #===========================================================================
    try:
        cur_index = ppdl.index( photo )
    except ValueError:
        raise Exception("ppdl:%s\nphotos:%s\nphoto.id:%s" % (ppdl, photos, photo.id) )
    
        
    next_index = cur_index + 1
    pre_index = cur_index -1
    
    if cur_index == 0:
        pre_index = total - 1
        
    if cur_index == total - 1:
        next_index = 0
    
    review = None
    event = None
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 2.75: %d" % time_elapsed
    if photo.get_review() != None:
        review = photo.content_object

    elif photo.get_event() != None:
        event = photo.content_object
        
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 3: %d" % time_elapsed
    
    #===========================================================================
    # organize photo preloading list
    #===========================================================================
    def get_preloaded_list( index, photo_list ):
        num_pre_item = 3
        num_post_item = 8
        preload_list = []
        p_pre = index - num_pre_item
        p_post = index + num_post_item 
        
        if p_pre < 0:
            preload_list.extend(photo_list[0:index])
            preload_list.extend(photo_list[p_pre:])
        else:
            preload_list.extend(photo_list[p_pre:index])
        
        if p_post > total - 1:
            preload_list.extend(photo_list[index+1:])
            preload_list.extend(photo_list[:p_post - (total-1)])
        else:
            preload_list.extend(photo_list[index+1:p_post])
        
        return set(preload_list)    
    
    preload_list = get_preloaded_list(cur_index, ppdl)
    
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 4: %d" % time_elapsed
    
    #===========================================================================
    # arrange the parameters required by the inc_post_boilerplate.html
    #===========================================================================
    allow_comment="1"
    action = None
    if review:
        avatar = review.user.get_profile()
        user_profile = avatar.get_profile()
        
        if not user_profile.public_comments or avatar.not_visible_by(request.user):
            allow_comment="0"
        
        content = review.content
        post_time = review.created
        comment_target = review
        
        if review.dish:
            pre_content_object = review.dish
            post_content_object = review.place
            todo_target = review.dish
        else:
            pre_content_object = review.place
            post_content_object = None
            todo_target = review.place
        
#        try:
#            action = Action.objects.get(target_object_id = review.id, verb = ActstreamSpecs.POSTED_A_REVIEW)
#        except ObjectDoesNotExist:
#            action = None
            
    elif event:
        avatar = photo.user.get_profile()
        user_profile = avatar.get_profile()
 
        if not user_profile.public_comments or avatar.not_visible_by(request.user):
            allow_comment="0"
 
        content = photo.description
        post_time = photo.created
        comment_target = photo
        
        if photo.dish:
            pre_content_object = photo.dish
            post_content_object = photo.place
            todo_target = photo.dish
        else:
            pre_content_object = photo.place
            post_content_object = None
            todo_target = photo.place
    # mturk photo
    else:
        if photo.place:
            avatar = photo.place
            pre_content_object = photo.place
            post_content_object = None
            todo_target = photo.place
        else:
            avatar = None
            pre_content_object = None
            post_content_object = None
            todo_target = None
        
        user_profile = None
        content = "Photo from: %s" % photo.urlOwner
        post_time = photo.created
        comment_target = photo
        
    target_content_type_id = ContentType.objects.get_for_model(comment_target).id
    
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 5: %d" % time_elapsed
    
    pps = gen_a_post(
        allow_comment=allow_comment,
        avatar=avatar,
        user_profile=user_profile,
        pre_content_object=pre_content_object,
        post_content_object=post_content_object,
        content=content,
        post_time=post_time,
        todo_target=todo_target,
        target_content_type_id=target_content_type_id,
        comment_target=comment_target,
        request=request,
        action = action,
    )
    print "url_4_html5", url_4_html5
    
    # time_start = time_end        
    # time_end = datetime.now()
    # time_elapsed = total_milliseconds(time_end - time_start)    
    # print "Stage 6: %d" % time_elapsed
    
    context={
        "review": review,
        "photo": photo,
        "preload_list": preload_list,
        "next_pid": ppdl[next_index].id,
        "pre_pid": ppdl[pre_index].id,
        "pps": pps,
        "object_id": object_id,
        "url_4_html5": url_4_html5
    }
    
    if is_render_to_string:
        rtn = render_to_string( 'inc_photos_details.html',
                                  context,
                                  context_instance = RequestContext(request)
                                  )
        return rtn
    else:
        # time_start = time_end        
        # time_end = datetime.now()
        # time_elapsed = total_milliseconds(time_end - time_start)    
        # print "Stage 7: %d" % time_elapsed 
        rtn = render_to_response( 'inc_photos_details.html',
                                   context,
                                   context_instance = RequestContext(request)
                                   )        
        # time_start = time_end        
        # time_end = datetime.now()
        # time_elapsed = total_milliseconds(time_end - time_start)    
        # print "Stage 8: %d" % time_elapsed
        return rtn