Ejemplo n.º 1
0
    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'})