def _handle_megamillions(self, date, record): winnings = json.loads(record.winnings) _base = winnings[:-1] _mega = winnings[-1:] base = dumps(_base) mega = dumps(_mega) # Check Existing existing = LotteryDraw.objects.filter(component=self._megamillions, date=date) if existing: existing = existing[0] if existing.result and existing.result != base: raise RuntimeError("Data Mismatch -%s- -%s-" % (existing.result, base)) # Check Existing (Megaplier) existing = LotteryDraw.objects.filter(component=self._megaplier, date=date) if existing: existing = existing[0] if existing.result and existing.result != mega: raise RuntimeError("Data Mismatch -%s- -%s-" % (existing.result, mega)) # Check Data handler = GameManager.get(self._megamillions.parent.code) handler.validate_numbers(_base) result_base = handler.decode(base) result_mega = handler.decode(mega, "Megaplier") # Create try: draw = LotteryDraw.objects.get(component=self._megamillions, date=date) except LotteryDraw.DoesNotExist: draw, created = LotteryDraw.objects.get_or_create( component=self._megamillions, date=date) finally: draw.result = result_base draw.official = True draw.save() # Create Megaplier try: draw = LotteryDraw.objects.get(component=self._megaplier, date=date) except LotteryDraw.DoesNotExist: draw, created = LotteryDraw.objects.get_or_create( component=self._megaplier, date=date) finally: draw.result = result_mega draw.official = True draw.save()
def _handle_powerball(self, date, record): existing = LotteryDraw.objects.filter(component=self._powerball, date=date) result = dumps(json.loads(record.winnings)) # Check Data Conflicts if existing: existing = existing[0] if existing.result and existing.result != result: raise RuntimeError("Data Mismatch -%s- -%s-" % (existing.result, result)) # Check Data handler = GameManager.get(self._powerball.parent.name) _result = handler.decode(record.winnings) handler.validate_numbers(json.loads(record.winnings)) # Create try: draw = LotteryDraw.objects.get(component=self._powerball, date=date) except LotteryDraw.DoesNotExist: draw, created = LotteryDraw.objects.get_or_create( component=self._powerball, date=date) finally: draw.result = _result draw.official = True draw.save()
def decode(cls, raw, format=None): pattern = re.compile(r"\d+") result = map(int, re.findall(pattern, raw)) if len(result) != 12: raise ValueError("Unexpected Decode Value: %s" % result) return dumps(result)
def decode(cls, raw, format="Powerball"): pattern = re.compile(r"\d+") result = map(int, re.findall(pattern, raw)) #power_play = result.pop() if len(result) != 7: raise ValueError("Unexpected Decode Value: %s" % result) return dumps(result)
def decode(cls, raw, format="MegaMillionsCA"): pattern = re.compile(r"\d+") result = map(int, re.findall(pattern, raw)) if format == "MegaMillionsCA": if len(result) != 6: raise ValueError("Unexpected Decode Value: %s for %s" % (result, format)) else: raise NotImplementedError() return dumps(result)
def decode(cls, raw, format=None): pattern = re.compile(r"\d+") #result = map(int, re.findall(pattern, raw)) result_from_xml = map(int, re.findall(pattern, raw)) temp_race_time = result_from_xml[-3:] racetime = ':'.join(str(x) for x in temp_race_time) result = result_from_xml[0:-3][1::2] if len(result) != 3: raise ValueError("Unexpected Decode Value: %s" % result) return dumps(result)
def decode(cls, raw, format="FantasyPowerball"): pattern = re.compile(r"\d+") result = map(int, re.findall(pattern, raw)) result_without_powerplay = result[0:6] if format == "Powerball": if len(result_without_powerplay) != 6: raise ValueError("Unexpected Decode Value: %s for %s" % (result, format)) else: raise NotImplementedError() return dumps(result)
def decode_race_time(cls, raw, format=None): pattern = re.compile(r"\d+") #result = map(int, re.findall(pattern, raw)) result_from_xml = map(int, re.findall(pattern, raw)) temp_race_time = result_from_xml[-3:] for idx,num in enumerate(temp_race_time): if idx==2 and num < 10: temp_race_time[idx]='0'+str(num) racetime = ':'.join(str(x) for x in temp_race_time) result = result_from_xml[0:-3][1::2] racetime = racetime.replace(':','.').replace('.',':',1) if len(temp_race_time) != 3: raise ValueError("Unexpected Race Value: %s" % result) return dumps(racetime)
def run(self): raise RuntimeError("Deprecated") for ticket in LegacyTicket.objects.filter(uid=self._source.pk): if ticket.type == "megamillions": game = LotteryGame.objects.get(code="MegaMillions") elif ticket.type == "powerball": game = LotteryGame.objects.get(code="Powerball") else: continue # Get Plays try: plays = json.loads(ticket.rows) except: continue # Get Component/ Handler handler = game.handler component = game.components.all()[0] date = datetime.datetime.fromtimestamp(ticket.dtime).date() submission = uuid.uuid4().hex[:16] # Convert Tickets validated = [] for play in plays: if game.code == "Powerball": _play = { u'numbers': play["numbers"] + [play["power"]], u'multiplier': play["pp"] } else: _play = { u'numbers': play["numbers"] + [play["mega"]], u'multiplier': play["mp"] } try: handler.validate_play(_play) except Exception as e: continue validated.append(_play) if not validated: continue # Retrieve Draw draw, created = LotteryDraw.objects.get_or_create(component=component, date=date) # Retrieve Ticket ticket, created = LotteryTicket.objects.get_or_create(user=self._target, draw=draw) for _play in validated: serialized = dumps(_play) # Retrieve Play play, created = LotteryTicketPlay.objects.get_or_create(ticket=ticket, play=serialized) if not created: continue # Calculate Winnings (if applicable) play.submission = submission play.update_winnings(save=True) # Mark Checked ticket.checked = True ticket.update(full=True)
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}
def post(self, request): from base64 import b64decode from django.core.files.base import ContentFile common_games=[0,1]# 0/Megamillion(TX),1/Powerball(TX) user = request.yoo["user"] old_version = False # Short-Circuit for Authentication Errors caused by invalid Device IDs if not request.yoo["user"] and request.yoo["auth"].get("__internal__reject__", False): raise exceptions.WebServiceAuthorizationFailed() try: data = process_req_body(json.loads(request.body)) if not isinstance(data, list): raise RuntimeError() except: raise exceptions.WebServiceException("Invalid Ticket Data Format") if data[0]['state'] == 'CA' and data[0]['gameType'] == 0: game_type = 13 elif data[0]['state'] == 'CA' and data[0]['gameType'] == 1: game_type = 11 else: game_type = data[0]['gameType'] games = {} success = False ticket = None for ticket in data: try: games[game_type] = EnumerationManager.game(game_type) except ValueError as e: raise exceptions.WebServiceException(str(e)) tickets = {} allocated = {} plays = [] result = [] submission = uuid.uuid4().hex[:16] try: client_login_record, created = UserClientLogin.objects.get_or_create(device=request.yoo['device']) except: client_login_record = UserClientLogin.objects.filter(device=request.yoo['device'])[0] if ( request.META["HTTP_YOO_APP_VERSION"] in ['3.0.2','4.2.2'] and data[0]['state'] == 'TX' ) or not request.yoo['new_version']: for record in data: game_type=record["gameType"] game = games[game_type]#LotteryGame Obj handler = game.handler component = handler.get_component(record) try: if not component: component = game.components.all()[0] except: continue date = datetime.datetime.strptime(record["drawingDate"], "%Y-%m-%d").date() if game_type in common_games: common_division = LotteryCountryDivision.objects.get(remote_id="TX") local_division = LotteryCountryDivision.objects.get(remote_id=record['state'])#TX,NY,AZ...(44) # Retrieve Draw common_draw, created = LotteryDraw.objects.get_or_create(component=component, date=date,division_id=common_division.id) # Retrieve Ticket ticket, created = LotteryTicket.objects.get_or_create(user=user,draw=common_draw,division_id=local_division.id) submission_record = None ticket_client, created = LotteryTicketClient.objects.get_or_create(device=str(request.yoo['device']).split(":")[1],draw=common_draw,email=client_login_record.client_login) tickets[ticket.pk] = ticket record = handler.preprocess_ticket(record) invalid = [] for _play in record["lines"]: # Sanitize Data try: handler.validate_play(_play) except Exception as e: invalid.append([_play, e]) continue serialized = dumps(_play) # Retrieve Play play, created = LotteryTicketPlay.objects.get_or_create(ticket=ticket, play=serialized,division_id=local_division.id) _saved = False if created:#new Play if not submission_record: submission_record, created = LotteryTicketSubmission.objects.get_or_create( submission=submission, ticket=ticket) submission_record.save() play.submission_old = submission play.submission = submission_record # Calculate Winnings (if applicable) play.update_winnings(save=True) if invalid: raise LotteryPlayInvalidException(["%s: %s" % (x[0]["numbers"], x[1].args[0]) for x in invalid]) else: division = LotteryCountryDivision.objects.get(remote_id=record['state']) # Retrieve Draw draw, created = LotteryDraw.objects.get_or_create(component=component, date=date,division_id=division.id) # Retrieve Ticket ticket, created = LotteryTicket.objects.get_or_create(user=user, draw=draw,division_id=division.id) submission_record = None tickets[ticket.pk] = ticket record = handler.preprocess_ticket(record) invalid = [] for _play in record["lines"]: # Sanitize Data try: handler.validate_play(_play) except Exception as e: invalid.append([_play, e]) continue serialized = dumps(_play) # Retrieve Play play, created = LotteryTicketPlay.objects.get_or_create(ticket=ticket, play=serialized,division_id=division.id) _saved = False if created: if not submission_record: submission_record, created = LotteryTicketSubmission.objects.get_or_create( submission=submission, ticket=ticket) play.submission_old = submission play.submission = submission_record # Calculate Winnings (if applicable) play.update_winnings(save=True) if invalid: raise LotteryPlayInvalidException(["%s: %s" % (x[0]["numbers"], x[1].args[0]) for x in invalid]) # Refresh Tickets for ticket in tickets.values(): allocated[ticket.pk] = ticket.update(request.yoo["device"],client_login_record.client_login) # Return Tickets 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 return result else: try: image_data = bytearray(eval(data[0]['image'])) except: from base64 import b64decode image_data = b64decode(data[0]['image']) old_version = True if data[0]['gameType'] == 3: data[0]['lines'] = [{"baseWager":"0.50","lineType":"ANY","numbers":[],"sum":None,"sumWager":None,"totalWager":"0.50"}] else: data[0]['lines'] = [{'amount': u'0.5', u'raceTime': u'', u'numbers': [], u'lineType': 0, u'multiplier': False}] for record in data: game = games[game_type]#LotteryGame Obj handler = game.handler component = handler.get_component(record) record.pop('image', 0) try: if not component: component = game.components.all()[0] except: continue date = datetime.datetime.strptime(record["drawingDate"], "%Y-%m-%d").date() if game_type in common_games: common_division = LotteryCountryDivision.objects.get(remote_id="TX") local_division = LotteryCountryDivision.objects.get(remote_id=record['state'])#TX,NY,AZ...(44) # Retrieve Draw common_draw, created = LotteryDraw.objects.get_or_create(component=component, date=date,division_id=common_division.id) # Retrieve Ticket try: ticket, created = LotteryTicket.objects.get_or_create(user=user,draw=common_draw,division_id=local_division.id,deleted=False) except: ticket = LotteryTicket.objects.filter(user=user,draw=common_draw,division_id=local_division.id,deleted=False)[0] ticket_client, created = LotteryTicketClient.objects.get_or_create(device=request.yoo['device'],draw=common_draw,email=client_login_record.client_login) play= LotteryTicketPlay.objects.create(ticket=ticket,division_id=local_division.id) play.save() available, created = LotteryTicketAvailable.objects.get_or_create(ticket=ticket,play=play,defaults={"json":record,"device":str(request.yoo['device'])}) available.image_first = ContentFile(image_data, str(play.id)+"_1.jpg") available.save() else: division = LotteryCountryDivision.objects.get(remote_id=record['state']) # Retrieve Draw draw, created = LotteryDraw.objects.get_or_create(component=component, date=date,division_id=division.id) #Retrieve Ticket ticket, created = LotteryTicket.objects.get_or_create(user=user, draw=draw,division_id=division.id,deleted=False) ticket_client, created = LotteryTicketClient.objects.get_or_create(device=request.yoo['device'],draw=draw,email=client_login_record.client_login) play= LotteryTicketPlay.objects.create(ticket=ticket,division_id=division.id) play.save() available, created = LotteryTicketAvailable.objects.get_or_create(ticket=ticket,play=play,defaults={"json":record,"device":str(request.yoo['device'])}) available.image_first = ContentFile(image_data, str(play.id)+"_1.jpg") available.save() success = True thread.start_new_thread( send_data_to_det, (success,ticket,play,game_type,image_data,data[0]['state'],old_version,data) ) return {"success":success}