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