コード例 #1
0
 def accessUplaces(self):
     from place.models import UserPlace
     result = []
     if self.accessHistory and 'uplaces' in self.accessHistory:
         for d in self.accessHistory['uplaces']:
             uplace = UserPlace.get_from_uuid(d['uuid'])
             uplace.accessed = d['timestamp']
             result.append(uplace)
     return result
コード例 #2
0
    def test_placed_by_url0_2(self):
        url, is_created = Url.get_or_create_smart('http://www.naver.com/')
        json_add = '''{"urls": [{"content": "%s"}]}''' % (url.content, )
        place1 = Place.objects.create()
        place2 = Place.objects.create()
        place3 = Place.objects.create()
        self.assertEqual(UserPlace.objects.count(), 0)

        pb = PostBase(json_add)
        uplace = UserPlace.objects.create(vd=self.vd)
        PostPiece.create_smart(uplace, pb)

        url.add_place(place1)
        self.assertEqual(UserPlace.objects.count(), 1)
        '''
        pb = PostBase(json_add)
        uplace, is_created = UserPlace.get_or_create_smart(pb, self.vd)
        PostPiece.create_smart(uplace, pb)
        print(is_created)
        #'''
        #UserPlace.dump_all()
        #'''
        response = self.client.post('/uplaces/', dict(add=json_add, ))
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        uplace = UserPlace.get_from_uuid(
            json_loads(response.content)['uplace_uuid'])
        uplace.place = None
        uplace.save()
        #'''
        self.assertEqual(UserPlace.objects.count(), 1 + 1)
        #UserPlace.dump_all()

        url.add_place(place2)
        self.assertEqual(UserPlace.objects.count(), 2 + 2)
        pb = PostBase(json_add)
        uplace = UserPlace.objects.create(vd=self.vd)
        PostPiece.create_smart(uplace, pb)
        self.assertEqual(UserPlace.objects.count(), 4 + 1)

        url.add_place(place3)
        self.assertEqual(UserPlace.objects.count(), 5 + 1)
        pb = PostBase(json_add)
        uplace = UserPlace.objects.create(vd=self.vd)
        PostPiece.create_smart(uplace, pb)
        self.assertEqual(UserPlace.objects.count(), 6 + 1)
コード例 #3
0
    def create(self, request, *args, **kwargs):
        # vd 조회
        vd = self.vd
        if not vd: return Response(status=status.HTTP_401_UNAUTHORIZED)

        # 결과 처리를 위한 변수 선언
        uplace = None

        #######################################
        # 삭제 포스트 처리
        #######################################
        if 'remove' in request.data and request.data['remove']:
            # PostBase instance 생성
            pb = PostBase(request.data['remove'])
            if 'place_id' in request.data and request.data['place_id']:
                pb.place_id = request.data['place_id']
            if 'uplace_uuid' in request.data and request.data['uplace_uuid']:
                pb.uplace_uuid = request.data['uplace_uuid']

            # 삭제 포스트는 반드시 uplace_uuid 가 지정되어야 한다.
            uplace = UserPlace.get_from_uuid(pb.uplace_uuid)
            if not uplace:
                raise ValueError('삭제 포스트 처리 시에는 반드시 uplace_uuid 가 지정되어야 함')

            # 삭제 PostPiece 생성
            pp = PostPiece.create_smart(uplace, pb, is_remove=True)

        #######################################
        # 추가 포스트 처리
        #######################################
        if 'add' in request.data and request.data['add']:
            # PostBase instance 생성
            pb = PostBase(request.data['add'])
            if 'place_id' in request.data and request.data['place_id']:
                pb.place_id = request.data['place_id']
            if 'uplace_uuid' in request.data and request.data['uplace_uuid']:
                pb.uplace_uuid = request.data['uplace_uuid']

            # 추가 정보 가져오기 : 유저가 직접 입력했다고 봐도 무방한 사항만
            pb.load_additional_info()

            # UserPlace/Place 찾기
            uplace, is_created = UserPlace.get_or_create_smart(pb, vd)

            # valid check
            if not pb.is_valid(uplace):
                raise ValueError('PostPiece 생성을 위한 최소한의 정보도 없음')

            # PostPiece 생성
            pp = PostPiece.create_smart(uplace, pb)

            # 임시적인 어드민 구현을 위해, MAMMA 가 추가로 뽑아준 post 가 있으면 추가로 포스팅
            pb_MAMMA = pb.pb_MAMMA
            if pb_MAMMA:
                # 아래 호출에서 Place 가 생성되고, 필요시 Place PostPiece 도 생성됨
                # TODO : 좀 더 Readability 가 높은 형태로 리팩토링
                uplace, is_created = UserPlace.get_or_create_smart(
                    pb_MAMMA, vd)

            # Place.lonLat 관련 예외 처리
            lonLat = (pb_MAMMA and pb_MAMMA.lonLat) or pb.lonLat
            if lonLat and uplace.place and (not uplace.place.lonLat or
                                            (pb_MAMMA and pb_MAMMA.lonLat)):
                uplace.place.lonLat = lonLat
                uplace.place.save()

            # 현재 위치 저장인 경우 이미지에 추가 정보 붙이기
            if is_created and lonLat and pb.images and len(
                    pb.images) == 1 and pb.images[0]:
                img = pb.images[0]
                img.lonLat = lonLat
                img.timestamp = uplace.created - 1000
                img.save()

            # 빠른 장소화를 위한 flag 세팅
            if is_created and not uplace.place:
                uplace.is_hurry2placed = True

            # 최종 저장
            uplace.lonLat = (uplace.place and
                             uplace.place.lonLat) or lonLat or uplace.lonLat
            uplace.modified = get_timestamp()
            # TODO : 아래 코드가 테스트되는 테스트 추가
            uplace.is_drop = False
            uplace.save()

            # Placed by Contents
            if pb.urls:
                placesets = [
                    set(url.places.all()) for url in pb.urls if url.places
                ]
                if placesets:
                    places = list(reduce(lambda a, b: a & b, placesets))
                    for place in places:
                        uplace.process_child(place)

        #######################################
        # 결과 처리
        #######################################
        serializer = self.get_serializer(uplace)
        cache_expire_ru(vd, 'uplaces')
        cache_expire_ru(vd, uplace.post_cache_name)
        return Response(serializer.data, status=status.HTTP_201_CREATED)