예제 #1
0
 def preprocess_ticket(cls, record):
     for i, play in enumerate(record["lines"]):
         if "lineType" in play:
             record["lines"][i]["lineType"] = cls.ENUM.get(play["lineType"], play["lineType"])
             
     processed = []
     last = None
     for i, play in enumerate(record["lines"]):
         if play["lineType"] == "SUM" and not last:
             continue
         if play["lineType"] != "SUM":
             _play = {
                 "baseWager": play["amount"],
                 "lineType": play["lineType"],
                 "totalWager": currency.format(play["amount"]),
                 "baseWager": None,
                 "numbers": play["numbers"],
                 "sum": None,
                 "sumWager": None
             }
             if _play["lineType"] == "COMBO":
                 _play["baseWager"] = currency.format(float(play["amount"]) / len(set(itertools.permutations(play["numbers"]))))
             elif _play["lineType"] in ["STRBOX", "EXTANY"]:
                 _play["baseWager"] = currency.format(float(play["amount"]) / 2)
             else:
                 _play["baseWager"] = currency.format(play["amount"])
             last = _play
             processed.append(_play)
         else:
             _play["sum"] = play["numbers"][0]
             _play["sumWager"] = currency.format(play["amount"])
             
             last = None
     record["lines"] = processed        
     return record
예제 #2
0
    def post(self,request):
      
	from yoolotto.util import currency
        import itertools

        # - parse json
        data = json.loads(request.body)
	end_component = 1
        valid = data['valid']
        state_codes={
             "TX":0,
             "CA":2,
             "AZ":3,
             "AR":4,
             "CO":5,
             "CT":6,
             "DE":7,
             "DC":8,
             "FL":9,
             "GA":10,
             "ID":11,
             "IL":12,
             "IN":13,
             "IA":14,
             "KS":15,
             "KY":16,
             "LA":17,
             "ME":18,
             "MD":19,
             "MA":20,
             "MI":21,
             "MN":22,
             "MO":23,
             "MT":24,
             "NE":25,
             "NH":26,
             "NJ":27,
             "NM":28,
             "NY":29,
             "NC":30,
             "ND":31,
             "OH":32,
             "OK":33,
             "OR":34,
             "PA":35,
             "RI":36,
             "SC":37,
             "SD":38,
             "TN":39,
             "VT":40,
             "VA":41,
             "WA":42,
             "WI":43,
             "WV":44,
         "WY":45
             }
        ticket_id = data['ticket']
        ticket_info = LotteryTicket.objects.get(id=ticket_id)

        play_id = data['playid']
        availability = LotteryTicketAvailable.objects.filter(play=play_id)[0]
        # - if valid
        if valid:

            
            # - get ticket info
            
            
            all_dates = data['drawdate'].split(",")
            defected = data["imagequality"]
            defected_ticket = False
            if defected == "No":
                defected_ticket = True
            draw_date = all_dates[0]
            data['drawdate'] = all_dates[0]
            division = data['state']
	    common_state = 1
            if division == 'CA':
                common_state = 2
            game_type_id = data['gametypeid']
            draw_time = data['drawTime']
            lines = []
            for item in data['lines']:
                lines.append(json.loads(json.dumps(item)))
            
            submission_record = None
            submission = uuid.uuid4().hex[:16]

            
            

            # - parse game type id
            if division == 'CA':
                game_types = {1:11,2:13}
                components = {1:"Powerballca",2:"MegaMillionsCA"}
            else:
                game_types = {1:1,4:6,8:7,7:5,6:4,3:2,5:3,2:0}
                components = {1:"Powerball",4:"TwoStep",7:"CashFive",3:"LottoTexas",2:"MegaMillions"}

            # - get game type
            game_type = game_types[game_type_id]

            # - get handler
            games = {}
            record = {}
            allocated = {}
            tickets = {}
            games[game_type] = EnumerationManager.game(game_type)
            game = games[game_type]#LotteryGame Obj
            handler = game.handler

            # - get component
            if game_type == 7 or game_type == 4 or game_type == 3:
                record = {'drawTime':draw_time}
                component = handler.get_component(record)
                end_component = None
                if data["consecutive"]:
                    record_copy = record
                    record_copy["drawTime"] = data["enddrawtime"]
                    end_component = handler.get_component(record_copy)
                #baseWager, sum, sumWager
                if game_type == 3:
                    enums = {1: "SUM",8: "ANY",9: "COMBO",10: "EXT",11: "EXTANY",}
                elif game_type == 4:
                    enums = {1: "SUM",2: "STR",3: "BOX",4: "STRBOX",5: "FRONT",6: "MID",7: "BACK",9: "COMBO"}
                if game_type == 3:
                    for line in lines:
                        line['sum'] = line.pop('sumitUp')
                        line['sumWager'] = line.pop('sumAmount')
                        line['baseWager'] = line['amount']
                        line['lineType'] = enums[line['lineType']]
			line['totalWager'] = line['amount']

			if line["lineType"] == "COMBO":
                            numbers = line['numbers']
                            if line['sum'] != None:
                                numbers = [line['sum']]
                            line["baseWager"] = currency.format(float(line["amount"]) / len(set(itertools.permutations(numbers))))
                        elif line["lineType"] in ["STRBOX", "EXTANY"]:
                            line["baseWager"] = currency.format(float(line["amount"]) / 2)
                        else:
                            line["baseWager"] = currency.format(line["amount"])

		elif game_type == 4:

                    for line in lines:
                        line['sum'] = line.pop('sumitUp')
                        line['sumWager'] = line.pop('sumAmount')
                        line['baseWager'] = line['amount']
                        line['lineType'] = enums[line['lineType']]
                        line['totalWager'] = line['amount']

			if line["lineType"] == "FRONT":
                            line["numbers"] = line["numbers"][0:2]+[0,0]
                        elif line["lineType"] == "MID":
                            line["numbers"] = [0]+line["numbers"][1:3]+[0]
                        elif line["lineType"] == "BACK":
                            line["numbers"] = [0,0]+line["numbers"][2:4]

			if line["lineType"] == "COMBO":
                            numbers = line['numbers']
                            if line['sum'] != None:
                                numbers = [line['sum']]
                            line["baseWager"] = currency.format(float(line["amount"]) / len(set(itertools.permutations(numbers))))
                        elif line["lineType"] in ["STRBOX", "EXTANY"]:
                            line["baseWager"] = currency.format(float(line["amount"]) / 2)
                        else:
                            line["baseWager"] = currency.format(line["amount"])

                else:
                    for line in lines:
                        line['sum'] = line.pop('sumitUp')
                        line['sumWager'] = line.pop('sumAmount')
                        line['baseWager'] = line['amount']
			line['totalWager'] = line['amount']

			

            else:
                component = LotteryGameComponent.objects.get(identifier=components[game_type_id])
                for line in lines :
                    line.pop('sumitUp')
                    line.pop('sumAmount')
                    line.pop('lineType')
                    line.pop('amount')
		    line['multiplier'] = data['ismultiplier']


            # - get updated draw
            date = datetime.datetime.strptime(draw_date, "%Y-%m-%d").date()
            updated_draw, created = LotteryDraw.objects.get_or_create(component=component,division_id=common_state,date=date)


            # - get record
            
            # - perform validation
            handler.preprocess_ticket(data)
            for item in lines :
                handler.validate_play(item)

            # - if draw is diffrent
            if updated_draw.id != ticket_info.draw.id :
                # create new ticket
                new_ticket_info, created = LotteryTicket.objects.get_or_create(deleted=False,user=ticket_info.user,draw=updated_draw,division=LotteryCountryDivision.objects.get(remote_id=division))
                valid_draw = updated_draw.id
                valid_ticket = new_ticket_info.id
                tickets[valid_ticket] = new_ticket_info

                submission_record, created = LotteryTicketSubmission.objects.get_or_create(submission=submission, ticket_id=valid_ticket)
                submission_record.save()

                # create new play
                for line in lines:
                    serialized = dumps(line)
                    play_record = LotteryTicketPlay(play=serialized,ticket=new_ticket_info,division=LotteryCountryDivision.objects.get(remote_id=division))
                    play_record.submission_old = submission
                    play_record.submission = submission_record
            
                    play_record.update_winnings(save=True)

                    line['gameType'] = game_type

                    available_record = LotteryTicketAvailable(available = True, json= line, ticket_id= valid_ticket, play_id=play_record.id, device = availability.device, image_first = "static/ticket/"+str(play_id)+"_1.jpg", defected = defected_ticket)

                    available_record.save()

                date = datetime.datetime.strptime(draw_date, "%Y-%m-%d").date()
                updated_draw, created = LotteryDraw.objects.get_or_create(component=component,division_id=common_state,date=date)

            else:
                # - if draw is same
                valid_draw = ticket_info.draw.id
                valid_ticket = ticket_info.id
                tickets[valid_ticket] = ticket_info

                submission_record, created = LotteryTicketSubmission.objects.get_or_create(submission=submission, ticket_id=valid_ticket)
                submission_record.save()

                availability.defected = defected_ticket
                #update previous play
                previous_play = LotteryTicketPlay.objects.get(id=play_id)

                if previous_play.play == None :
                    serialized = dumps(lines[0])
                    previous_play.play = serialized
                    previous_play.ticket = ticket_info
                    previous_play.division = LotteryCountryDivision.objects.get(remote_id=division)
                    previous_play.submission_old = submission
                    previous_play.submission = submission_record
                    previous_play.update_winnings(save=True)
                    lines.pop(0)
                
		availability.available = True
                availability.save()
                # create new play
                for line in lines:
                    serialized = dumps(line)
                    
                    play_record = LotteryTicketPlay(play=serialized,ticket=ticket_info,division=LotteryCountryDivision.objects.get(remote_id=division))
                    play_record.submission_old = submission
                    play_record.submission = submission_record
                    play_record.update_winnings(save=True)

                    line['gameType'] = game_type

                    available_record = LotteryTicketAvailable(available = True, json= line, ticket_id= valid_ticket, play_id=play_record.id, device = availability.device, image_first = "static/ticket/"+str(play_id)+"_1.jpg", defected = defected_ticket)

                    available_record.save()
            # - send notification

            user_devices = ticket_info.user.devices.all()
            text = 'your ticket is available'

            if game_type_id == 11:
                    gameType = 1
            elif game_type_id == 13:
                    gameType = 2
            else:
                    gameType = game_type_id
	    try:
            	for device in user_devices:
                    if not device.device_token:
                        continue

                    if device.is_ios():
                        apn = APNSender(device.device_token, text=text,
                                        custom={"code": "data_entry", "gameType": gameType,
                                                "drawId":valid_draw, "state":state_codes[division]
                                                })
                        apn.send()

                    elif device.is_android():

                        gcm = GCMSender(to=[device.device_token], data={"text": text,
                                                                        "code": "data_entry", "gameType": gameType,
                                                                        "state":division,
                                                                        "drawId":valid_draw,
                                                                        "ticket_id":valid_ticket
                                                                        })

                        gcm.send()
	    except:
		pass
            # - return result

            
	    
            try:
                user_client_record, created = UserClientLogin.objects.get_or_create(device=availability.device)
            except:
                user_client_record = UserClientLogin.objects.filter(device=availability.device)[0]

            for ticket in tickets.values():
                    allocated[ticket.pk] = ticket.update(availability.device,user_client_record.client_login)

            result = map(lambda x: x.representation(allocated=allocated), tickets.values())
            for _result in result:
                    coins = allocated.get(_result["ticket_id"], None)
                    if coins < 1:
                        coins = None

                    _result["coins"] = coins

            multi_draws = []
            draws = self.get_draws(all_dates,component,common_state,game_type,data['state'],end_component,handler)
            for each_draw in draws:

                multi_ticket_info, created = LotteryTicket.objects.get_or_create(deleted=False,user=ticket_info.user,draw=each_draw,division=LotteryCountryDivision.objects.get(remote_id=division))
                valid_ticket = multi_ticket_info.id

                submission_record, created = LotteryTicketSubmission.objects.get_or_create(submission=submission, ticket_id=valid_ticket)
                submission_record.save()

                for line in lines:
                    serialized = dumps(line)
                    play_record = LotteryTicketPlay(play=serialized,ticket=multi_ticket_info,division=LotteryCountryDivision.objects.get(remote_id=division))
                    play_record.submission_old = submission
                    play_record.submission = submission_record
            
                    play_record.update_winnings(save=True)

                    line['gameType'] = game_type

                    available_record = LotteryTicketAvailable(available = True, json= line, ticket_id= valid_ticket, play_id=play_record.id, device = availability.device, image_first = "static/ticket/"+str(play_id)+"_1.jpg")

                    available_record.save()

                #tickets[valid_ticket] = new_ticket_info
            #return result
        
        else:
            # - if reject
            
            # - send notification
            reason = data['RejectReason']
            availability.rejected = True
            availability.reason = reason
            availability.save()

            text = 'Your Ticket is Rejected'
            send_reject_notification(ticket_info,text,reason,)
            

        return {"sucess":True}