def post(cls, request, ev_id=None): ev = request.data if ev_id: e = get_object_or_404(Event, pk=ev_id) else: e = Event() for k, v in ev.items(): if k in ['pk', 'players', 'owners', 'task_id', 'place', 'game']: continue if 'date' in k: try: v = datetime.datetime.strptime(v, '%Y-%m-%d %H:%M %z') except: v = parse_datetime(v) setattr(e, k, v) # setting the place place = ev.get('place', None) if place: if type(place) == str: place = GEOSGeometry(place) else: place = GEOSGeometry(str(place['geometry'])) if isinstance(place, Polygon): place = MultiPolygon(place) e.place = place # setting the game g = ev.get('game', None) if g: g = get_object_or_404(Game, pk=g['pk']) e.game = g e.save() e.owners.add(request.user) players_ids = [] for ep in ev.get('players', []): pk = ep['pk'] if pk < 0: # negative pk will create the player p = Player() p = cls.create_player(ep) else: p = Player.objects.get(pk=pk) p.about = ep['username'] p.set_position(*ep['pos']) players_ids.append(p.pk) e.set_playing(p, avoid_playing_event=True) Clue.objects.filter(player=p, event=e).delete() for ch in ep.get('challenges', []): c = Challenge.objects.get(pk=ch['pk'], games=e.game) clue = Clue(player=p, event=e, challenge=c, main=True) clue.save() players = e.players.exclude(membership__player__pk__in=players_ids) for p in players: p.user.delete() return Response({'status': 'ok'})