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
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