def get(self, emails): response = {'found': [], 'notFound': []} if (emails == 'feeling_lucky'): #I'm feeling lucky! luckyHacker = Hacker.query().get() response['found'].append({ 'email': luckyHacker.email, 'secret': luckyHacker.secret }) return self.response.write(json.dumps(response)) emails = emails.split(',') for email in emails: hacker = Hacker.query(Hacker.email == email).fetch( projection=Hacker.secret) if len(hacker) > 0: response['found'].append({ 'email': email, 'secret': hacker[0].secret }) else: response['notFound'].append(email) self.response.write(json.dumps(response))
def get(self): data = {} data['Signed Up'] = EmailListEntry.query().count() data['Registered'] = Hacker.query().count() data['Accepted'] = Hacker.query(Hacker.admitted_email_sent_date != None).count() data['Confirmed'] = Hacker.query(Hacker.rsvpd == True).count() data['Waitlisted'] = Hacker.query(Hacker.waitlist_email_sent_date != None).count() data['Declined'] = deletedHacker.DeletedHacker.query(deletedHacker.DeletedHacker.admitted_email_sent_date != None).count() self.response.write(json.dumps(data))
def get(self): data = {} data['Signed Up'] = EmailListEntry.query().count() data['Registered'] = Hacker.query().count() data['Accepted'] = Hacker.query( Hacker.admitted_email_sent_date != None).count() data['Confirmed'] = Hacker.query(Hacker.rsvpd == True).count() data['Waitlisted'] = Hacker.query( Hacker.waitlist_email_sent_date != None).count() data['Declined'] = deletedHacker.DeletedHacker.query( deletedHacker.DeletedHacker.admitted_email_sent_date != None ).count() self.response.write(json.dumps(data))
def getAllHackers(projection=[], accepted=False): memcachedKey = memcachedBase + str(projection) + str(accepted) hackers = memcache.get(memcachedKey) if hackers is None: if projection: hackers = Hacker.query(projection=projection) else: hackers = Hacker.query() if accepted: hackers = hackers.filter(Hacker.admitted_email_sent_date != None) hackers = hackers.fetch() if not memcache.set(memcachedKey, hackers, cacheTime): logging.error("Memcache set failed") return hackers
def get(self): if not onTeam(): return self.redirect('/') user = users.get_current_user() if not user: self.redirect(users.create_login_url(self.request.uri)) return def formatter(person): JSON = {} key = getattr(person, 'key') JSON['id'] = key.urlsafe() JSON['kind'] = key.kind() JSON.update(person.asDict(['email', 'name', 'checked_in'])) return JSON from models import Volunteer, Rep source = map(formatter, Hacker.query(Hacker.checked_in == False).fetch()) source += map(formatter, Rep.query(Rep.checked_in == False).fetch()) source += map(formatter, Volunteer.query(Volunteer.checked_in == False).fetch()) total_checked_in = getTotal() session = models.CheckInSession() session.user = user.email() session.put() token = channel.create_channel(session.key.urlsafe()) self.response.write(template("checkin.html", {"source" : json.dumps(source), 'total_checked_in' : total_checked_in, 'token' : token}))
def post(self): to_put = [] for h in itertools.chain(Hacker.query(), EmailListEntry.query()): if h.email != h.email.lower(): h.email = h.email.lower() to_put.append(h) ndb.put_multi(to_put) self.response.write("Well, it seemed to work...")
def get(self, number): if not isAdmin(): return self.redirect('/') if isMasterDB(): return self.redirect('/') number = int(number) ndb.delete_multi(Hacker.query().fetch(limit=number, keys_only=True)) self.response.write("Eliminated {0} hackers.".format(number))
def get(self, number): if not isAdmin(): return self.redirect("/") if isMasterDB(): return self.redirect("/") number = int(number) ndb.delete_multi(Hacker.query().fetch(limit=number, keys_only=True)) self.response.write("Eliminated {0} hackers.".format(number))
def get(self): if not onTeam(): return self.redirect('/') keys = list(set(list(hacker_keys) + list(personal_info_keys) + list(non_required_keys) + ['status', 'admit_priority', 'rsvpd', 'checked_in', 'has_resume', 'secret', 'address1', 'address2', 'city', 'state', 'country', 'zip'])) if (not self.request.get('include_personally_identifiable_info')) or not isAdmin(): for key in personal_info_keys: keys.remove(key) self.response.headers['Content-Type'] = 'text/csv; charset=utf-8' writer = csv.DictWriter(self.response, fieldnames=keys) writer.writeheader() for hacker in Hacker.query(): writer.writerow({key: unicode(val).encode('utf-8') for key, val in hacker.asDict(keys).iteritems()})
def get(self, emails): response = {'found' : [], 'notFound' : []} if (emails == 'feeling_lucky'): #I'm feeling lucky! luckyHacker = Hacker.query().get() response['found'].append({'email': luckyHacker.email, 'secret' : luckyHacker.secret}) return self.response.write(json.dumps(response)) emails = emails.split(',') for email in emails: hacker = Hacker.query(Hacker.email == email).fetch(projection=Hacker.secret) if len(hacker) > 0: response['found'].append({'email' : email, 'secret' : hacker[0].secret}) else: response['notFound'].append(email) self.response.write(json.dumps(response))
def getHackersToBeChecked(): # Cache this value, results don't need to be updated quickly. toCheckIn = 'hackers_to_be_checked' data = memcache.get(toCheckIn) if data is not None: logging.debug("Used cache") return data else: data = Hacker.query(ndb.AND(Hacker.rsvpd == True, Hacker.checked_in != True)).fetch(projection=[Hacker.name, Hacker.email]) logging.debug("Could not use cache") if not memcache.add(toCheckIn, data, cacheTime): logging.error('Memcache set failed') return data
def post(self): hackers = Hacker.query(Hacker.phone_number == self.request.get('phone')).fetch(keys_only=True) request = MentorRequest() request.location = self.request.get('location') request.issue = self.request.get('issue') request.tags = self.request.get('tags').split(', ') if len(hackers): request.requester = hackers[0] request.requester_phone = self.request.get('phone') request.put() self.redirect('/?dayof=1#mrc') # #mrc: mentor-request-confirm (we don't want that showing up in URLs)
def getHackersToBeChecked(): # Cache this value, results don't need to be updated quickly. toCheckIn = 'hackers_to_be_checked' data = memcache.get(toCheckIn) if data is not None: logging.debug("Used cache") return data else: data = Hacker.query( ndb.AND(Hacker.rsvpd == True, Hacker.checked_in != True)).fetch( projection=[Hacker.name, Hacker.email]) logging.debug("Could not use cache") if not memcache.add(toCheckIn, data, cacheTime): logging.error('Memcache set failed') return data
def cleanup(property, jsonKeys): hackers = Hacker.query().filter(Hacker._properties[property].IN(jsonKeys.keys())) changed = [] for hacker in hackers: newProp = jsonKeys.get(getattr(hacker, property, None), None) print(newProp) if newProp: setattr(hacker, property, newProp) changed.append(hacker) try: ndb.put_multi(changed) except Exception as err: return {"success": False, "msg": str(err.args[0])} successMsg = "Changed the " + property + " of " + str(len(changed)) + " hackers." return {"success": True, "msg": successMsg}
def post(self): hackers = Hacker.query( Hacker.phone_number == self.request.get('phone')).fetch( keys_only=True) request = MentorRequest() request.location = self.request.get('location') request.issue = self.request.get('issue') request.tags = self.request.get('tags').split(', ') if len(hackers): request.requester = hackers[0] request.requester_phone = self.request.get('phone') request.put() self.redirect( '/?dayof=1#mrc' ) # #mrc: mentor-request-confirm (we don't want that showing up in URLs)
def post(self): if not isAdmin(): return self.redirect('/') parsed_request = json.loads(self.request.body) # Angular apparently only sends json as text not as 'JSON' emails = parsed_request.get('emails') for address in emails: hacker = Hacker.query(Hacker.email == address).fetch() if hacker: for h in hacker: # should only be one if parsed_request.get('change') == "Accept": if h.admitted_email_sent_date == None: accept_hacker(h) if parsed_request.get('change') == "Remove": deletedHacker.createDeletedHacker(h, "manual") h.key.delete() if parsed_request.get('change') == 'Waitlist': if h.admitted_email_sent_date == None: waitlist_hacker(h)
def cleanup(property, jsonKeys): hackers = Hacker.query().filter(Hacker._properties[property].IN( jsonKeys.keys())) changed = [] for hacker in hackers: newProp = jsonKeys.get(getattr(hacker, property, None), None) print(newProp) if newProp: setattr(hacker, property, newProp) changed.append(hacker) try: ndb.put_multi(changed) except Exception as err: return {"success": False, "msg": str(err.args[0])} successMsg = "Changed the " + property + " of " + str( len(changed)) + " hackers." return {"success": True, "msg": successMsg}
def updateSchema(cursor=None, num_updated=0): to_put = [] hackers, next_curs, more = Hacker.query().fetch_page(BATCH_SIZE, start_cursor=cursor) for hacker in hackers: append = False #Making sure nobody is admitted hacker.admitted_email_sent_date = None #Changing receipts to a repeated property if hacker.receipts is None or hacker.receipts == [None]: hacker.receipts = [] append = True elif isinstance(hacker.receipts, ndb.BlobKeyProperty): receipt = hacker.receipts hacker.receipts = [receipt] append = True #Removing schools with whitespace around them. if hacker.school.strip() != hacker.school: hacker.school = hacker.school.strip() append = True #Creating the reimbursement max field if hacker.rmax == 0 or hacker.rmax is None: hacker.rmax = reimbursement.getMax(hacker.school) append = True if append: to_put.append(hacker) if to_put: ndb.put_multi(to_put) num_updated += len(to_put) logging.debug('Put %d entities to Datastore for a total of %d', len(to_put), num_updated) deferred.defer(updateSchema, cursor=next_curs, num_updated=num_updated) else: logging.debug('updateSchema complete with %d updates!', num_updated)
def post(self): if not isAdmin(): return self.redirect('/') parsed_request = json.loads( self.request.body ) # Angular apparently only sends json as text not as 'JSON' emails = parsed_request.get('emails') for address in emails: hacker = Hacker.query(Hacker.email == address).fetch() if hacker: for h in hacker: # should only be one if parsed_request.get('change') == "Accept": if h.admitted_email_sent_date == None: accept_hacker(h) if parsed_request.get('change') == "Remove": deletedHacker.createDeletedHacker(h, "manual") h.key.delete() if parsed_request.get('change') == 'Waitlist': if h.admitted_email_sent_date == None: waitlist_hacker(h)
def updateSchema(cursor=None, num_updated=0): to_put = [] hackers, next_curs, more = Hacker.query().fetch_page(BATCH_SIZE, start_cursor=cursor) for hacker in hackers: append = False # Making sure nobody is admitted hacker.admitted_email_sent_date = None # Changing receipts to a repeated property if hacker.receipts is None or hacker.receipts == [None]: hacker.receipts = [] append = True elif isinstance(hacker.receipts, ndb.BlobKeyProperty): receipt = hacker.receipts hacker.receipts = [receipt] append = True # Removing schools with whitespace around them. if hacker.school.strip() != hacker.school: hacker.school = hacker.school.strip() append = True # Creating the reimbursement max field if hacker.rmax == 0 or hacker.rmax is None: hacker.rmax = reimbursement.getMax(hacker.school) append = True if append: to_put.append(hacker) if to_put: ndb.put_multi(to_put) num_updated += len(to_put) logging.debug("Put %d entities to Datastore for a total of %d", len(to_put), num_updated) deferred.defer(updateSchema, cursor=next_curs, num_updated=num_updated) else: logging.debug("updateSchema complete with %d updates!", num_updated)
def get(self): if not onTeam(): return self.redirect('/') user = users.get_current_user() if not user: self.redirect(users.create_login_url(self.request.uri)) return def formatter(person): JSON = {} key = getattr(person, 'key') JSON['id'] = key.urlsafe() JSON['kind'] = key.kind() JSON.update(person.asDict(['email', 'name', 'checked_in'])) return JSON from models import Volunteer, Rep source = map(formatter, Hacker.query(Hacker.checked_in == False).fetch()) source += map(formatter, Rep.query(Rep.checked_in == False).fetch()) source += map(formatter, Volunteer.query(Volunteer.checked_in == False).fetch()) total_checked_in = getTotal() session = models.CheckInSession() session.user = user.email() session.put() token = channel.create_channel(session.key.urlsafe()) self.response.write( template( "checkin.html", { "source": json.dumps(source), 'total_checked_in': total_checked_in, 'token': token }))
def get_query(self): if self.audience == 'registered': return Hacker.query() elif self.audience == 'accepted': return Hacker.query(Hacker.admitted_email_sent_date != None) elif self.audience == 'accepted-non-local': return Hacker.query(Hacker.admitted_email_sent_date != None) elif self.audience == 'invited-friends': return Hacker.query(Hacker.teammates != None) elif self.audience == 'mailing-list-unregistered': return EmailListEntry.query() elif self.audience == 'waitlisted': print "sending waitlisted emails: " + str(Hacker.query(Hacker.admitted_email_sent_date == None).count()) return Hacker.query(Hacker.admitted_email_sent_date == None) elif self.audience == 'hardware-hackers': print "sending emails to admitted hardware-hackers: " + str(Hacker.query(Hacker.admitted_email_sent_date != None, Hacker.hardware_hack == 'yes').count()) return Hacker.query(Hacker.admitted_email_sent_date != None, Hacker.hardware_hack == 'yes') elif self.audience == 'accepted-highschool-freshmen': print "sending emails to accepted highschool and freshman hackers" return Hacker.query(ndb.AND(Hacker.admitted_email_sent_date != None, ndb.OR(Hacker.year == 'highschool', Hacker.year == 'freshman'))) elif self.audience == 'local-waitlisted': print "sending emails to local waitlisted hackers: " return Hacker.query(Hacker.admitted_email_sent_date == None) elif self.audience == 'rsvped-first-time': print "sending emails to rsvped-first-time hackers" return Hacker.query(ndb.AND(Hacker.rsvpd == True, Hacker.first_hackathon =='yes')) elif self.audience == 'checked-in': print 'sending emails to checked-in hackers: ' + str(Hacker.query(Hacker.checked_in == True).count()) return Hacker.query(Hacker.checked_in == True) elif self.audience == 'accepted-local': print "sending emails to accepted-local" return Hacker.query(Hacker.admitted_email_sent_date != None) elif self.audience == None: return None else: assert 0, "Unknown audience"
def send_to_entity_async(self, entity): try: if self.audience == 'invited-friends': # don't actually send to the hacker -- send to their friends hacker = entity if hacker.teammates: emails = [email.lower() for email in hacker.teammates.split(',')] matching_hackers = yield Hacker.query(Hacker.email.IN(emails)).fetch_async() emails_already_registered = [h.email for h in matching_hackers] for email in emails: if email not in emails_already_registered: self.send_to_email(email, {"invited_by": hacker}) elif self.audience == 'registered': # send emails directly to hackers hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'mailing-list-unregistered': email = entity.email is_registered = (yield Hacker.query(Hacker.email == email).count_async()) > 0 if not is_registered: self.send_to_email(email, {}) elif self.audience == 'waitlisted': hacker = entity hacker.waitlist_email_sent_date = datetime.datetime.now() self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) hacker.put() elif self.audience == 'hardware-hackers': #also send directly to hackers hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'accepted': hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'accepted-non-local': hacker = entity if hacker.school == "Brown University" or hacker.school == "Rhode Island School of Design": return if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'local-waitlisted': hacker = entity print hacker.school if hacker.school != "Brown University" and hacker.school != "Rhode Island School of Design": return if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'accepted-highschool-freshmen': hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'rsvped-first-time': hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'checked-in': hacker = entity if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) elif self.audience == 'accepted-local': hacker = entity print hacker.school if hacker.school != "Brown University" and hacker.school != "Rhode Island School of Design": return if hacker.email and self.email_subject: self.send_to_email(hacker.email, {"hacker": hacker, "name":hacker.name.split(" ")[0]}) if hacker.phone_number and self.sms_text: self.send_to_phone(hacker.phone_number) except Exception as e: print "Failed to send email '{0}' to '{1} because {2}'".format(self.email_subject, entity.email, e)
def getTotalFromDB(): from models import Volunteer, Rep total_checked_in = Hacker.query(Hacker.checked_in == True).count() total_checked_in += Rep.query(Rep.checked_in == True).count() total_checked_in += Volunteer.query(Volunteer.checked_in == True).count() return total_checked_in
def createTestHacker(number): shirts = ['XS', 'S', 'M', 'L', 'XL', 'XXL'] def prob(): return random.uniform(0.0, 10.0) hacker = Hacker() hacker.name = "Hacker {0}".format(number) hacker.school = "Brown University" if prob() < 3 else "Another University" hacker.year = "freshman" if prob() < 3: hacker.year = "sophomore" elif prob() < 3: hacker.year = "junior" elif prob() < 3: hacker.year = "senior" hacker.email = "hacker_{0}@{1}.edu".format( number, hacker.school.lower().split(" ")[0]) hacker.secret = generate_secret_for_hacker_with_email(hacker.email) hacker.shirt_gen = "M" if prob() < 5 else "W" hacker.shirt_size = random.choice(shirts) rawDiet = [ "Vegetarian", "Vegan", "Gluten Free", "Kosher", "Lactose Intolerant", "Nuts Allergy", "Treenuts Allergy", "Soy Allergy", "Shellfish Allergy", "Corn Allergy", "No Pork", "No Ham", "No Beef", "No Mutton", "Halal", "No Red Meat", "None" ] drs = [] while prob() < 2: item = random.choice(rawDiet) rawDiet.remove(item) drs.append(item) hacker.dietary_restrictions = ','.join(drs) tms = [] while prob() < 2: tms.append("hacker_{0}@another.edu".format(random.randint(0, number))) hacker.teammates = ','.join(tms) hacker.hardware_hack = "yes" if prob() > 8 else "no" hacker.first_hackathon = "yes" if prob() > 7 else "no" def numberString(length): return ''.join( map(lambda x: str(random.randint(0, 9)), range(0, length))) if prob() < 1: hacker.phone_number = numberString(10) #MOst will be confirmed, some will be waitlisted. if prob() < 8: hacker.rsvpd = True elif prob() < 3: hacker.waitlist_email_sent_date = datetime.datetime.now() states = [ "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" ] hacker.address1 = "Creative" hacker.address2 = "Address" hacker.city = "City" hacker.country = "Country" hacker.state = random.choice(states) hacker.zip = numberString(5) if hacker.school == "Another University": hacker.rmax = 1000 else: hacker.rmax = 0 hacker.rtotal = random.randint(0, hacker.rmax) return hacker
def createTestHacker(number): shirts = ["XS", "S", "M", "L", "XL", "XXL"] def prob(): return random.uniform(0.0, 10.0) hacker = Hacker() hacker.name = "Hacker {0}".format(number) hacker.school = "Brown University" if prob() < 3 else "Another University" hacker.year = "freshman" if prob() < 3: hacker.year = "sophomore" elif prob() < 3: hacker.year = "junior" elif prob() < 3: hacker.year = "senior" hacker.email = "hacker_{0}@{1}.edu".format(number, hacker.school.lower().split(" ")[0]) hacker.secret = generate_secret_for_hacker_with_email(hacker.email) hacker.shirt_gen = "M" if prob() < 5 else "W" hacker.shirt_size = random.choice(shirts) rawDiet = [ "Vegetarian", "Vegan", "Gluten Free", "Kosher", "Lactose Intolerant", "Nuts Allergy", "Treenuts Allergy", "Soy Allergy", "Shellfish Allergy", "Corn Allergy", "No Pork", "No Ham", "No Beef", "No Mutton", "Halal", "No Red Meat", "None", ] drs = [] while prob() < 2: item = random.choice(rawDiet) rawDiet.remove(item) drs.append(item) hacker.dietary_restrictions = ",".join(drs) tms = [] while prob() < 2: tms.append("hacker_{0}@another.edu".format(random.randint(0, number))) hacker.teammates = ",".join(tms) hacker.hardware_hack = "yes" if prob() > 8 else "no" hacker.first_hackathon = "yes" if prob() > 7 else "no" def numberString(length): return "".join(map(lambda x: str(random.randint(0, 9)), range(0, length))) if prob() < 1: hacker.phone_number = numberString(10) # MOst will be confirmed, some will be waitlisted. if prob() < 8: hacker.rsvpd = True elif prob() < 3: hacker.waitlist_email_sent_date = datetime.datetime.now() states = [ "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", ] hacker.address1 = "Creative" hacker.address2 = "Address" hacker.city = "City" hacker.country = "Country" hacker.state = random.choice(states) hacker.zip = numberString(5) if hacker.school == "Another University": hacker.rmax = 1000 else: hacker.rmax = 0 hacker.rtotal = random.randint(0, hacker.rmax) return hacker