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