Ejemplo n.º 1
0
    def like(self, request, data, act_id):
        try:
            act = Activity.objects.get(id=act_id)
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="activity not found"))
        if act.liked_by.filter(id=request.user.id).exists():
            likes = act.liked_by.all()[0:2]
            length = likes.count()
            if length > 0 and act.recent_like_user_id == request.user.id:
                if length > 1:
                    act.recent_like_user = likes[1]
                else:
                    act.recent_like_user = None

            act.liked_by.remove(request.user)
            act.like_num -= 1
            act.save()
            return JsonResponse(dict(success=True, data=dict(liked=False, like_num=act.liked_by.count())))
        else:
            act.like_num += 1
            act.liked_by.add(request.user)
            act.recent_like_user = request.user
            act.save()
            if act.user != request.user:
                send_notification.send(
                    sender=Activity,
                    target=act.user,
                    display_mode="minimal",
                    extra_info="like",
                    related_act=act,
                    related_user=request.user
                )
            return JsonResponse(dict(success=True, data=dict(liked=True, like_num=act.liked_by.count())))
Ejemplo n.º 2
0
def post_new_status(request, data):
    form = StatusCreationForm(data, request.FILES)
    if form.is_valid():
        status = form.save()
        if 'inform_of' in data:
            ats = get_user_model().objects.filter(id__in=data['json_data'])
            for at in ats:
                # send_notification.send(sender=get_user_model(),
                #                        message_type="status_inform",
                #                        target=at,
                #                        message_body="",
                #                        related_status=status)
                send_notification.send(
                    sender=Status,
                    target=at,
                    display_mode="with_cover",
                    extra_info="at",
                    related_user=request.user,
                    related_status=status
                )
        return JsonResponse(dict(success=True, data=status.dict_description()))
    else:
        response_dict = dict(success=False)
        response_dict.update(form.errors)
        logger.debug(u"Fail to post new status, the error info is %s" % response_dict)
        return JsonResponse(response_dict)
Ejemplo n.º 3
0
 def invite(self, request, data, act_id):
     appliers = data.get('target_user')
     appliers = json.loads(appliers)
     try:
         act = Activity.objects.get(id=act_id)
     except ObjectDoesNotExist:
         return JsonResponse(dict(success=True, message="Activity Not Found"))
     users = User.objects.filter(~Q(id=request.user.id), id__in=appliers)
     if len(users) != len(appliers):
         return JsonResponse(dict(success=False, message="user id list is not valid"))
     for user in users:
         # send_notification.send(
         #     sender=ActivityJoin,
         #     target=user,
         #     related_user=request.user,
         #     related_act=act,
         #     message_type="act_invited",
         #     message_body=""
         # )
         send_notification.send(
             sender=ActivityJoin,
             target=user,
             display_mode="interact",
             extra_info="invited",
             related_act=act,
             related_user=request.user
         )
     return JsonResponse(dict(success=True))
Ejemplo n.º 4
0
def club_apply(request, club_id):
    try:
        club = Club.objects.get(pk=club_id)
    except ObjectDoesNotExist:
        return JsonResponse(dict(success=False, message="club not found"))
    if ClubJoining.objects.filter(user=request.user, club=club).exists():
        return JsonResponse(dict(success=False, message="already join"))
    if Notification.objects.filter(
        target=club.host,
        related_user=request.user,
        related_club=club,
        sender_class_name=ClubJoining.__name__,
        extra_info="apply",
        checked=False,
    ).exists():
        return JsonResponse(dict(success=False, message="already applied"))
    # send_notification.send(
    #     sender=Club,
    #     target=club.host,
    #     related_user=request.user,
    #     related_club=club,
    #     message_type="club_apply",
    #     message_body=""
    # )
    send_notification.send(
        sender=ClubJoining,
        target=club.host,
        display_mode="interact",
        extra_info="apply",
        related_club=club,
        related_user=request.user
    )
    return JsonResponse(dict(success=True))
Ejemplo n.º 5
0
def activity_apply(request, act_id):
    """ 报名活动
    """
    try:
        act = Activity.objects.get(id=act_id)
    except ObjectDoesNotExist:
        return JsonResponse(dict(success=False, code="7001", message="Activity with id %s not found" % act_id))
    # permission check
    if act.authed_user_only and not request.user.identified:
        return JsonResponse(dict(success=False, message="no permission"))

    # club = act.allowed_club
    # if club is not None:
    #     if not ClubJoining.objects.filter(club=club, user=request.user).exists():
    #         logger.debug(u'有个用户试图加入一个他并未加入的俱乐部的活动,权限问题。用户为{phone}, 活动为{act_id}'.format(
    #             phone=request.user.username, act_id=act_id
    #         ))
    #         return JsonResponse(dict(success=False, message='Not Allowed'))

    # 检查是否已经报满了

    current_join_count = ActivityJoin.objects.filter(activity=act, approved=True).count()
    if current_join_count >= act.max_attend:
        return JsonResponse(dict(success=False, message="full"))

    join, created = ActivityJoin.objects.get_or_create(user=request.user, activity=act)

    if not created:
        logger.debug(u'对活动{act_id}出现了重复报名, 用户为{phone}'.format(act_id=act_id, phone=request.user.username))
        return JsonResponse(dict(success=False, message="denied"))
    else:
        # send a notification to the host of the activity
        # send_notification.send(sender=Activity,
        #                        target=act.user,
        #                        related_user=request.user,
        #                        message_type="act_applied",
        #                        related_act=act,
        #                        message_body="")
        send_notification.send(
            sender=ActivityJoin,
            target=act.user,
            display_mode="with_cover",
            extra_info="apply",
            related_user=request.user,
            related_act=act
        )
    return JsonResponse(dict(success=True, join=True))
Ejemplo n.º 6
0
    def invite_agree(self, request, data, act_id):
        inviter_id = data.get('target_user')
        try:
            notif = Notification.objects.select_related("related_act").get(
                extra_info="invited",
                sender_class_name=ActivityJoin.__name__,
                target=request.user,
                related_act_id=act_id,
                related_user_id=inviter_id,
                checked=False
            )
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="Not Invited"))
        # 检查是否已经报满了
        act = notif.related_act
        cur_join_num = ActivityJoin.objects.filter(activity=act, approved=True).count()
        if cur_join_num >= act.max_attend:
            return JsonResponse(dict(success=False, message="full"))
        notif.flag = True
        notif.checked = True
        notif.save()
        # send_notification.send(
        #     sender=Activity,
        #     target=notif.related_user,
        #     related_user=request.user,
        #     related_act=notif.related_act,
        #     message_type="act_invitation_agreed",
        #     message_body=""
        # )
        send_notification.send(
            sender=ActivityJoin,
            target=notif.related_user,
            display_mode="minimal",
            extra_info="invite_agreed",
            related_user=request.user,
            related_act=notif.related_act
        )
        join, created = ActivityJoin.objects.get_or_create(
            user=request.user, activity=act
        )
        if not created:
            join.approved = True
            join.save()

        return JsonResponse(dict(success=True))
Ejemplo n.º 7
0
    def invite_deny(self, request, data, act_id):
        applier = data.get('target_user')
        try:
            notif = Notification.objects.select_related("related_act", "related_user").get(
                extra_info="invited",
                sender_class_name=ActivityJoin.__name__,
                target=request.user,
                related_user_id=applier,
                related_act_id=act_id,
                checked=False
            )
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="Not invited"))

        notif.flag = False
        notif.checked = True
        notif.save()
        #
        # send_notification.send(
        #     sender=Activity,
        #     target=notif.related_user,
        #     related_act=notif.related_act,
        #     related_user=request.user,
        #     message_type="act_invitation_denied",
        #     message_body=""
        # )
        send_notification.send(
            sender=ActivityJoin,
            target=notif.related_user,
            display_mode="minimal",
            extra_info="invite_denied",
            related_user=request.user,
            related_act=notif.related_act
        )
        join, created = ActivityJoin.objects.get_or_create(
            user=request.user, activity=notif.related_act
        )
        if created and join.approved:
            join.approved = False
            join.save()
        return JsonResponse(dict(success=True))
Ejemplo n.º 8
0
    def save_model(self, request, obj, form, change):
        old_obj = SportCarIdentificationRequestRecord.objects.get(id=obj.id)
        if not old_obj.checked and obj.checked:
            own = obj.ownership
            own.identified = obj.approved
            own.identified_at = timezone.now()
            user = own.user
            if own.identified and user.avatar_car is None:
                user.avatar_car = own
                user.save()
            own.save()
            send_notification.send(
                sender=SportCarIdentificationRequestRecord,
                target=user,
                display_mode="minimal",
                extra_info="agree" if obj.approved else "deny",
                related_user=user,
                related_own=own
            )

        super(SportCarIdentificationRequestRecordAdmin, self)\
            .save_model(request, obj, form, change)
Ejemplo n.º 9
0
    def follow(self, request, data, user_id):
        try:
            target_user = User.objects.get(id=user_id)
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="User Not Found"))

        obj, created = UserRelation.objects.get_or_create(source_user=request.user, target_user=target_user)
        if not created:
            obj.delete()
            return JsonResponse(dict(success=True, followed=False))
        else:
            # send_notification.send(sender=User,
            #                        target=target_user,
            #                        message_type="relation_follow",
            #                        related_user=request.user,
            #                        message_body="")
            send_notification.send(
                sender=User,
                target=target_user,
                display_mode="minimal",
                extra_info="like",
                related_user=request.user
            )
            return JsonResponse(dict(success=True, followed=True))
Ejemplo n.º 10
0
 def kick_out(self, request, data, act_id):
     # TODO: 去掉活动申请加入的审核,直接加进来就可以了
     applier = data.get("target_user")
     try:
         join = ActivityJoin.objects.select_related("user", "activity").get(user_id=applier, activity_id=act_id)
     except ObjectDoesNotExist:
         return JsonResponse(dict(success=False, message="Application not found"))
     # send_notification.send(
     #     sender=ActivityJoin,
     #     target=join.user,
     #     related_act=join.activity,
     #     message_type="kickout",
     #     message_body=""
     # )
     join.delete()
     send_notification.send(
         sender=ActivityJoin,
         target=join.user,
         display_mode="with_cover",
         extra_info="kick_out",
         related_act=join.activity,
         related_user=request.user
     )
     return JsonResponse(dict(success=True))
Ejemplo n.º 11
0
def post_activity_comment(request, data, act_id):
    """ 对活动发布评论
     返回分配给这个活动的id
    """
    try:
        activity = Activity.objects.get(id=act_id)
    except ObjectDoesNotExist:
        return JsonResponse(dict(success=False, message="Activity not found", code='7000'))

    if 'response_to' in data:
        try:
            response_to = ActivityComment.objects.get(id=data['response_to'])
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, code='7001', message='Activity comment not found.'))
    else:
        response_to = None

    try:
        comment = ActivityComment.objects.create(
            user=request.user, image=request.FILES.get('image', None),
            content=data.get('content', None), response_to=response_to, activity=activity
        )
    except ValidationError:
        return JsonResponse(dict(success=False, code='7002', message='No valid content found for the comment'))

    if 'inform_of' in data:
        inform_users = get_user_model().objects.filter(id__in=data['json_data'])
        comment.inform_of.add(*inform_users)
        for at in inform_users:
            send_notification.send(
                sender=ActivityComment,
                target=at,
                display_mode="with_cover",
                extra_info="at",
                related_user=request.user,
                related_act=activity,
                related_act_comment=comment
            )

    if response_to is not None:
        send_notification.send(
            sender=ActivityComment,
            target=response_to.user,
            display_mode="with_cover",
            extra_info="response",
            related_user=request.user,
            related_act=activity,
            related_act_comment=comment
        )
    if request.user != activity.user:
        send_notification.send(
            sender=ActivityComment,
            target=activity.user,
            display_mode="with_cover",
            extra_info="response",
            related_user=request.user,
            related_act=activity,
            related_act_comment=comment
        )

    return JsonResponse(
        dict(success=True,
             data=dict(id=comment.id, comment_num=ActivityComment.objects.filter(activity=activity).count()))
    )
Ejemplo n.º 12
0
def activity_create(request, data):
    """ 创建活动
     需要上传的参数为:
      - name
      - description
      - inform_of       提醒的用户的列表
      - max_attend
      - start_at
      - end_at
      - club_limit
      - poster
      - location
       |- lat
       |- lon
       |- description
       |- city
    """
    if not SportCarOwnership.objects.filter(user=request.user, identified=True).exists():
        return JsonResponse(dict(success=False, message="no permission"))
    if 'inform_of' in data:
        inform_of = json.loads(data['inform_of'])
        users = get_user_model().objects.filter(id__in=inform_of)
    else:
        users = None
    location = json.loads(data['location'])
    # if 'club_limit' in data:
    #     try:
    #         club_limit = Club.objects.get(id=data['club_limit'])
    #     except ObjectDoesNotExist:
    #         club_limit = None
    # else:
    #     club_limit = None
    loc = Location.objects.create(
        location=Point(location['lon'], location['lat']),
        description=location['description'],
        city=location.get("city") or ""
    )
    act = Activity.objects.create(
        name=data['name'],
        description=data['description'],
        max_attend=data['max_attend'],
        start_at=datetime.datetime.strptime(data['start_at'], '%Y-%m-%d %H:%M:%S.%f %Z'),
        end_at=datetime.datetime.strptime(data['end_at'], '%Y-%m-%d %H:%M:%S.%f %Z'),
        location=loc,
        allowed_club=None,
        poster=request.FILES['poster'],
        user=request.user,
        authed_user_only=(data["authed_user_only"])
    )
    # ActivityJoin.objects.create(user=request.user, activity=act)
    if users is not None:
        act.inform_of.add(*users)
        for user in users:
            # send_notification.send(
            #     sender=Activity,
            #     target=user,
            #     related_act=act,
            #     related_user=request.user,
            #     message_type="act_invited",
            #     message_body=""
            # )
            send_notification.send(
                sender=ActivityJoin,
                target=user,
                display_mode="interact",
                extra_info="invited",
                related_act=act,
                related_user=request.user
            )

    return JsonResponse(dict(success=True, id=act.id))
Ejemplo n.º 13
0
def status_operation(request, data, status_id):
    if 'op_type' not in data:
        logger.warn(u'动态操作错误')
        return JsonResponse(dict(success=False, code='4300', message='No valid operation type param found.'))
    op_type = data['op_type']
    try:
        status = Status.objects.get(id=status_id, deleted=False)
    except ObjectDoesNotExist:
        return JsonResponse(dict(success=False, code='4002', message='Status not found.'))

    if op_type == 'like':
        # 点赞
        obj, created = StatusLikeThrough.objects.get_or_create(user=request.user,
                                                               status=status)
        if not created:

            likes = StatusLikeThrough.objects.select_related("user").filter(status=status).order_by("-like_at")[0: 2]
            length = likes.count()
            if length > 0 and obj.id == likes[0].id:
                if length > 1:
                    status.recent_like_user = likes[1].user
                else:
                    status.recent_like_user = None
                status.save()
            obj.delete()
        elif status.user != request.user:
            status.recent_like_user = request.user
            status.save()
            send_notification.send(
                sender=Status,
                target=status.user,
                display_mode="with_cover",
                extra_info="like",
                related_user=request.user,
                related_status=status
            )
        result = dict(
            like_state=created,
            like_num=StatusLikeThrough.objects.filter(status=status).count()
        )
        return JsonResponse(dict(success=True, like_info=result))
    elif op_type == "delete":
        # 删除
        if status.user != request.user:
            # no permission
            logger.warning(u'动态删除权限问题, 参与用户id:{user_id}, 涉及动态为{status_id}'.format(
                user_id=request.user.id,
                status_id=status.id
            ))
            return JsonResponse(dict(success=False, code="code", message="no permission"))
        status.deleted = True
        status.save()
        return JsonResponse(dict(success=True))
    elif op_type == "report":
        StatusReport.objects.get_or_create(
            user=request.user,
            status=status,
            reason=data["reason"]
        )
        return JsonResponse(dict(success=True))
    else:
        logger.warning(u"非法操作, 涉及用户为%s" % request.user.id)
        return JsonResponse(dict(success=False, code='4004', message='Operation not defined'))
Ejemplo n.º 14
0
def status_post_comment(request, data, status_id):
    """ 发布评论
     post上来的data的结构为
     :keyword response_to   回复的目标评论,可以不存在
     :keyword inform_of     要@的人的id列表
     :keyword content       评论的文字内容
     :keyword image         评论的图片,从request.FILES中取得
    """
    try:
        status = Status.objects.get(id=status_id)
    except ObjectDoesNotExist:
        return JsonResponse(dict(success=False, code='4002', message='Status not found.'))
    if 'response_to' in data:
        try:
            response_to = StatusComment.objects.get(id=data['response_to'])
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, code='4002', message='Comments not found.'))
    else:
        response_to = None
    try:
        # Caution: image属性即将废除
        comment = StatusComment.objects.create(user=request.user,
                                               image=request.FILES.get('image', None),
                                               content=data.get('content', None),
                                               response_to=response_to,
                                               status=status)
    except ValidationError:
        logger.debug(u'发表动态评论的时候失败,缺少必要数据。目前提交的内容为%s' % data.get('content', None))
        return JsonResponse(dict(success=False, code='4003', message=u'No valid content found for the comment'))

    if 'inform_of' in data:
        ats = get_user_model().objects.filter(id__in=data['json_data'])
        comment.inform_of.add(*ats)
        for at in ats:
            # send_notification.send(sender=get_user_model(),
            #                        message_type="status_inform",
            #                        target=at,
            #                        message_body="",
            #                        related_status=status)
            send_notification.send(
                sender=StatusComment,
                target=at,
                display_mode="with_cover",
                extra_info="at",
                related_user=request.user,
                related_status=status,
                related_status_comment=comment
            )

    # if the comment replies to another comment, send a notification to the sender of that comment as well.
    if 'response_to' in data:
        # send_notification.send(sender=StatusComment,
        #                        message_type="status_comment_replied",
        #                        target=response_to.user,
        #                        message_body=comment.content,
        #                        related_status_comment=comment,
        #                        related_status=status,
        #                        related_user=comment.user)
        send_notification.send(
            sender=StatusComment,
            target=response_to.user,
            display_mode="with_cover",
            extra_info="response",
            related_user=comment.user,
            related_status=comment.status,
            related_status_comment=comment
        )
        if response_to.user == status.user:
            # avoid duplicated notifications about the same comment
            return JsonResponse(dict(success=True, id=comment.id))
    # send a notification message to the sender of the status
    if status.user != request.user:
        # send_notification.send(sender=Status,
        #                        message_type="status_comment",
        #                        target=status.user,
        #                        message_body=comment.content,
        #                        related_status_comment=comment,
        #                        related_status=status,
        #                        related_user=comment.user)
        send_notification.send(
            sender=StatusComment,
            target=status.user,
            display_mode="with_cover",
            extra_info="response",
            related_user=comment.user,
            related_status=comment.status,
            related_status_comment=comment
        )
    return JsonResponse(dict(success=True, id=comment.id))
Ejemplo n.º 15
0
def club_operation(request, data, club_id):
    op_type = data.get("op_type")
    if op_type == "club_apply_agree":
        applier = data.get("target_user")
        try:
            notif = Notification.objects\
                .select_related("related_club", "related_user", "target")\
                .get(
                    extra_info="apply",
                    sender_class_name=ClubJoining.__name__,
                    related_user_id=applier,
                    target=request.user,
                    related_club_id=club_id,
                )
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="Applicant not found"))
        notif.checked = True
        notif.flag = True
        notif.save()
        # send_notification.send(
        #     sender=Club,
        #     target=notif.related_user,
        #     related_user=notif.target,
        #     related_club=notif.related_club,
        #     message_type="club_apply_agreed",
        #     message_body=""
        # )
        send_notification.send(
            sender=ClubJoining,
            target=notif.related_user,
            display_mode="with_cover",
            extra_info="agree",
            related_user=notif.target,
            related_club=notif.related_club
        )
        ClubJoining.objects.get_or_create(
            user=notif.related_user,
            club=notif.related_club
        )
        # create the related chat entity
        entity, created = ChatEntity.objects.get_or_create(
            host=notif.related_user,
            club=notif.related_club
        )
        if created:
            message = entity.dict_description()
            message = json.dumps({"target_user": entity.host.id, "payload": message})
            send_string_message(message)
        return JsonResponse(dict(success=True))
    elif op_type == "club_apply_denied":
        applier = data.get("target_user")
        try:
            notif = Notification.objects \
                .select_related("related_club", "related_user", "target") \
                .get(
                    extra_info="apply",
                    sender_class_name=ClubJoining.__name__,
                    related_user_id=applier,
                    target=request.user,
                    related_club_id=club_id,
                )
        except ObjectDoesNotExist:
            return JsonResponse(dict(success=False, message="Applicant not found"))
        notif.checked = True
        notif.flag = False
        notif.save()
        # send_notification.send(
        #     sender=Club,
        #     target=notif.related_user,
        #     related_user=notif.target,
        #     related_club=notif.related_club,
        #     message_type="club_apply_denied",
        #     message_body=""
        # )
        send_notification.send(
            sender=ClubJoining,
            target=notif.related_user,
            display_mode="with_cover",
            extra_info="deny",
            related_user=notif.target,
            related_club=notif.related_club
        )
        return JsonResponse(dict(success=True))
    else:
        return JsonResponse(dict(success=False, message="Undefined Operation Type"))