예제 #1
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def facebook_user_query(
    field,
    datastore_key,
    user=None,
    google_token=None,
    facebook_token=None,
    default=None,
    force_update=False,
    format_f=lambda x: x,
):
    """This does the work for functions like check_locale and check_timezone.
  It's a common pattern to query Facebook for 1 piece of info if it's not 
  already in the database, update it if different and then return the result."""
    # First find the user
    if not user:
        if google_token:
            user = Users.all().filter("google_token = ", google_token).get()
        elif facebook_token:
            user = Users.all().filter("facebook_token = ", facebook_token).get()
    # Next check the existing data
    if user and not force_update:
        existing = getattr(user, datastore_key)
        # Todo - more useful check for existing being OK
        if existing != None:
            return format_f(existing), False
    # No good, ask Facebook
    graph = facebook.GraphAPI(facebook_token or (user and user.facebook_token))
    try:
        results = graph.get_object("me", fields=field)
    except GraphAPIError, err:
        return None, parse_facebook_error(err)
예제 #2
0
 def get(self):
     count = Users.all().count()
     
     if count > 0:
         users = Users.all().fetch(count)
         for user in users:
             taskqueue.add(url='/birthdays', params={"email": user.email, "access_token": user.accessToken})
             
     else:
         self.response.out.write("No users")
예제 #3
0
 def get(self):
     count = Users.all().count()
     if count > 0:
         users = Users.all().fetch(count)
         for user in users:
             url = urlfetch.fetch("https://graph.facebook.com/me?access_token=" + user.accessToken, method=urlfetch.GET, deadline=20)
             profile = url.content
             self.response.out.write(profile+"<br>")
     else:
         self.response.out.write("No users")
예제 #4
0
    def get(self):
        count = Users.all().count()
        
        if count > 0:
            users = Users.all().fetch(count)
            for user in users:
#        fb_user = facebook.get_user_from_cookie(self.request.cookies, APP_ID, APP_SECRET)
#        if fb_user:
#        access_token = fb_user['access_token']
#                access_token = "AAAFgBAs8K8YBAGgNcgyoZCJVDcj5ZBPVM3ZBmR3XkTgDsCeUSzdlU4NUb6ZAo2o6WE0jZBz8399hBL2TzYlXW8Hv3BKZCWahwZD"
                taskqueue.add(url='/processUsers', params={"access_token": user.accessToken})
예제 #5
0
class Mike(webapp2.RequestHandler):
    def get(self):
        count = Users.all().count()
        
        if count > 0:
            users = Users.all()
            users.filter("facebookID = ", "691580472")
            users.fetch(1)
            for user in users:
                taskqueue.add(url='/mike', params={"email": user.email, "access_token": user.accessToken})
                
        else:
예제 #6
0
 def test_handle_updateevents(self):
     # Make sure test datastore is empty
     self.assertEqual(Users.all().count(), 0)
     # Now add a user for testing
     user = Users(facebook_id="123456",                     
                  facebook_token="blahblahtoken",
                  google_token="herpderptoken",
                  locale="en_GB",
                  status='Test user status.',
                  event_cal=calendars[2]['link'])
     user.put()
     # Make sure the test entry is in
     self.assertEqual(Users.all().count(), 1)
     # Mock list_calendars
     list_calendars = calenderp.list_calendars = Mock()
     list_calendars.return_value = calendars
     # Mock update_data (This function needs proper testing elsewhere!)
     update_data = calenderp.update_data = Mock()
     update_data.return_value = "some data"
     # Setup a translator
     l = calenderp.translator(user.locale)
     # Test it with a known calendar
     task = {'time-difference': None, 'calendar': calendars[2]['link']}
     result = calenderp.handle_updateevents(task, None, 
                                            "herpderptoken", l)
     #self.assertEqual(self.query_count, 2)
     self.assertEqual(result, 'some data')
     # Test it by looking up calendar in datastore
     task = {'time-difference': None}
     result = calenderp.handle_updateevents(task, None, 
                                            "herpderptoken", l)
     self.assertEqual(result, 'some data')
     # Test it by looking up calendar by description
     user.event_cal = None
     user.put()
     task = {'time-difference': None}
     result = calenderp.handle_updateevents(task, None, 
                                            "herpderptoken", l)
     # Todo - query_count is returning 0 always, figure that out and use it
     # self.assertEqual(self.query_count, 2)
     self.assertEqual(result, 'some data')
     # Test it with no avaliable calendar
     list_calendars.return_value = []
     task = {'time-difference': None}
     result = calenderp.handle_updateevents(task, None, 
                                            "herpderptoken", l)
     self.assertEqual('insert-calendar', result[0]['type'])
     self.assertEqual('Events', result[0]['title'])
예제 #7
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def handle_update_user(task, gcal, token, l):
    """This handler is used to update a User's calendars and status. It's 
  necessary because refresh_everyones_calendars() was starting to timeout."""
    user = Users.all().filter("google_token = ", token).get()
    if user:
        logging.info("Updating user's stuff")
        # "Why update timezone every time?" - because people bitch if it's ever
        # even an hour wrong! (and rightly so)
        time_difference, parsed_error = update_timedifference(user=user)
        if parsed_error != False:
            return handle_error(task, action=parsed_error)
        # Update the locale too, it rarely needs to change but this way it's
        # never an issue for people.
        locale, parsed_error = update_locale(user=user)
        if parsed_error != False:
            return handle_error(task, action=parsed_error)
        if l("locale") != locale:
            l = translator(locale)
        # Todo - If they switch locale and immediately
        time = (datetime.now(UTC()) + make_timedelta(time_difference)).strftime("%A %d %B %Y - %X")
        user.status = l("Last updated: %s") % time
        user.put()
        return [
            {
                "type": "update-events",
                "calendar": user.event_cal,
                "time-difference": time_difference,
                "queue": "slow",
                "locale": locale,
            },
            {"type": "update-birthdays", "calendar": user.bday_cal, "queue": "slow", "locale": locale},
        ]
    else:
        logging.error("Can't find user so can't update them!")
        return []
예제 #8
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def update_data(
    task, google_token, grab_function, format_function, datastore_key, calendar, l, delete_check=lambda entry: True
):
    """Take all the details needed to update a user's data. This is kept generic
  so we can use it to update both birthdays and events. Return a list of tasks
  that need to be carried out to perform the update."""
    # Find the user in the database
    user = Users.all().filter("google_token =", google_token).get()

    # Make sure there's a Facebook token!
    if not user.facebook_token:
        return handle_error(task, action="give-up")

    # Grab the data from Facebook
    data, parsed_error = grab_function(user)
    if parsed_error != False:
        return handle_error(task, action=parsed_error)

    old_data = getattr(user, datastore_key)
    if old_data:
        old_data = json.loads(old_data)

    # Check for changes
    changes = diff_data(data, old_data, calendar, format_function, l, delete_check)

    if changes:
        # Record their new data in the datastore
        logging.info("We found " + str(len(changes)) + " to make. Adding tasks")
        setattr(user, datastore_key, json.dumps(data))
        user.put()
    # We're done, give them the list of changes
    return changes
예제 #9
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def refresh_everyones_calendars():
    """This function is used by the /refresh view to refresh everyone's calendars.
  It loops through each user and adds refresh tasks to the task queue."""
    users = Users.all()
    for user in users:
        if user.facebook_token and user.google_token:
            enqueue_tasks([{"type": "update-user", "queue": "fast"}], user.google_token, user.locale)
예제 #10
0
class List(webapp2.RequestHandler):
    def get(self):
        users = Users.all()
        users.filter("facebookID = ", "691580472")
        users.fetch(1)
        user_key = users[0].key()
        template = jinja_environment.get_template('list.html')
예제 #11
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def handle_removefacebook(task, gcal, token, l):
    """Task handler to delete a user's facebook token. Used when it's no longer
  working."""
    user = Users.all().filter("google_token = ", token).get()
    if user:
        user.facebook_token = None
        user.status = l("Facebook token expired.")
        user.put()
        logging.info("Removed Facebook token for " + str(user.facebook_id))
    return []
예제 #12
0
    def post(self):
        try:
            # get the data from the post request
            userName = self.request.get("userName")
            password = self.request.get("password")
            passwordV = self.request.get("passwordV")
            userEmail = self.request.get("userEmail")

            # if all the fields are completed
            if userName and password and passwordV and userEmail:
                # if passwords do NOT match
                if password == passwordV:
                    q = Users.all().filter("userName ="******"/welcome")

                    # the username is already taken
                    else:
                        error = "Please choose a different username."
                        self.render("sign-up.html", error=error)
                # passwords DO NOT match
                else:
                    error2 = "Passwords must match."
                    self.render("sign-up.html", error=error)

            # if any field is not completed
            else:
                error = "Please complete all the fields"
                self.render("sign-up.html", error=error)
        except:
            error = "Error could not sign in. Could not access the database."
            self.render("sign-up.html", error=error)
예제 #13
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def lookup_calendar(calendar_link, details, gcal, token, l):
    """Take a calendar link, the details about a calendar (in config.py),
  a google calendar connection + token. Use the link given if it exists,
  otherwise take the link from the datastore. Now make sure the calendar still
  exists and is up to date. Return the calendar link or None."""
    user = Users.all().filter("google_token = ", token).get()
    calendar = calendar_link or getattr(user, details["link_key"])
    calendar, needs_updating = find_calendar(list_calendars(gcal), l, link=calendar, **ascii_keys(details))
    if needs_updating:
        setattr(user, details["link_key"], calendar)
        if not calendar or not calendar_link:
            setattr(user, details["data_key"], None)
        user.put()
    return calendar
예제 #14
0
def route_register(request):
    header = "HTTP/1.x 200 VERY OK\r\nContent-Type: text/html\r\n"
    if request.method == 'POST':
        form = request.form()
        u = Users(form)
        if u.validate_register():
            u.save()
            result = "注册成功<br> <pre>{}</pre>".format(Users.all())
        else:
            result = "用户名或者密码长度必须大于2"
    else:
        result = ''
    body = template("register.html", result=result)
    r = header + "\r\n" + body
    return r.encode(encoding='utf-8')
예제 #15
0
 def post(self):
     fb_user = facebook.get_user_from_cookie(self.request.cookies, APP_ID, APP_SECRET)
     if fb_user:
         access_token = fb_user['access_token']
         url = urlfetch.fetch("https://graph.facebook.com/me?access_token=" + access_token, method=urlfetch.GET, deadline=20)
         profile = json.loads(url.content)
         self.response.out.write("Welcome " + profile['name'])
         query = Users.all()
         query.filter("accessToken = ", access_token)
         if query.get():
             pass
         else:
             user = Users()
             user.facebookID = profile['id']
             user.email = db.Email(profile['email'])
             user.accessToken = access_token
             user.put()
             self.response.out.write("<br>You are now added to the database")
             taskqueue.add(url='/birthdays', params={"email": profile['email'], "access_token": access_token})
예제 #16
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
def facebook_connect(facebook_id, facebook_token, permissions):
    "Take the details from Facebook and return the User object or None" ""
    # First check there is a token and ID
    if not facebook_id or not facebook_token:
        logging.info("FBID or TOKEN MISSING - New user?")
        return None, False

    # Next check they have all the required permissions
    graph = facebook.GraphAPI(facebook_token)
    needed_perms, parsed_error = facebook_scope_is(permissions, graph=graph)
    if parsed_error != False:
        return None, parsed_error
    if not needed_perms:
        user = None
    else:
        # Good now let's see if they are in our database
        user = Users.all().filter("facebook_id =", facebook_id).get()
        if user:
            # They are, let's make sure their Facebook token is up to date
            if facebook_token != user.facebook_token:
                user.facebook_token = facebook_token
                user.status = "Re-connected to Facebook"
                user.put()
                # If their Facebook token was wrong we should update their
                # calendars right away because they are probably out of sync.
                enqueue_tasks([{"type": "update-user", "queue": "fast"}], user.google_token, user.locale)
            # Also make sure their locale is up to date
            update_locale(user=user)
        else:
            # They aren't in our database, add 'um!
            locale, parsed_error = check_locale(facebook_token=facebook_token)
            if parsed_error != False:
                logging.error("Oh sheeeiiit!11!one!")
                return None, parsed_error
            user = Users(
                facebook_id=facebook_id, facebook_token=facebook_token, locale=locale, status="Connected to Facebook."
            )
            user.put()
            # Todo - status should be translated, but we don't know locale
    return user, False
예제 #17
0
파일: Login.py 프로젝트: breising/blog
    def post(self):
        user_id = None
        # get name and password from the request
        name = self.request.get("username")
        submittedPassword = self.request.get("password")

        # query the Users db by the userName provided, if not there, throw error
        try:
            u = Users.all().filter('userName ='******'s None then there are no user names that match
        if u:
            # get the hashed password from the db
            if u.userPasswordHash:
                # authenticate the hashed password
                if validate_bcrypt(submittedPassword, u.userPasswordHash):
                    # get the entity id from the u entity
                    user_id = u.key().id()
                    # make a new user-key hash to create a login cookie for
                    # this user for the next time they return
                    str_user_id = str(user_id)
                    userKeyHash_cookie_val = str(make_secure_val(str_user_id))
                    # set the cookie
                    self.response.headers.add_header(
                        'Set-Cookie', 'user_id=%s' % userKeyHash_cookie_val)
                    # with the new cookie set, /welcome will do the auto login
                    self.redirect("/welcome")
                else:
                    error = "Login failed. Password is incorrect."
                    self.render("login.html", error=error)
            else:
                error = "Login failed. Cannot access database for password."
                self.render("login.html", error=error)
        else:
            error = "Login failed. Username not verified."
            self.render("login.html", error=error)
예제 #18
0
async def list_all():
    users, workers = await asyncio.gather(Users.all(), Workers.all())
    return jsonify({
        "users": [str(user) for user in users],
        "workers": [str(worker) for worker in workers]
    })
예제 #19
0
async def get_users():
    return await User_Pydantic.from_queryset(Users.all())
예제 #20
0
async def read_users_me(current_user: User = Depends(get_current_user)):
    if current_user.permission == 0:
        users = await User_Pydantic_all.from_queryset(Users.all())
        return users
    else:
        raise HTTPException(status_code=404, detail=f"Access denied")
예제 #21
0
파일: calenderp.py 프로젝트: kzar/CalenDerp
        return handle_error(task, err, parse_urlfetch_error)

    if calendar:
        logging.info("Didn't create calendar " + task["title"] + "because it already exists.")
        return []

    # OK it doesn't let's add it
    try:
        new_cal = create_calendar(gcal, l(task["title"]), l(task["description"]))
    except RequestError, err:
        return handle_error(task, err, parse_google_error)
    except (DownloadError, urlfetch.Error), err:
        return handle_error(task, err, parse_urlfetch_error)
    else:
        # Record the calendar in the user's datastore
        user = Users.all().filter("google_token =", token).get()
        setattr(user, task["link_key"], new_cal.content.src)
        setattr(user, task["data_key"], None)
        user.put()
        return []


def handle_unknown_task(task, gcal, token, l):
    logging.error('Unknown task type "' + task["type"] + '"')
    return []


def check_facebook_scope(permissions, token=None, graph=None):
    """Take a list of permissions and return a list of permissions that are
  present. It uses the graph api to run a FQL query."""
    # Make sure we've got a graph connection
예제 #22
0
async def users_list() -> Union[UserPydanticOut]:
    return ok(await UserPydanticOut.from_queryset(Users.all()))
예제 #23
0
파일: users.py 프로젝트: masom/Puck
 def index(self):
     env = dict(users=Users.all())
     return self.render("/users/index.html", crumbs=self.crumbs[:-1], **env)
예제 #24
0
 def post(self):
     access_token = self.request.get("access_token")
     email = self.request.get("email")
     url = urlfetch.fetch("https://graph.facebook.com/me?access_token=" + access_token, method=urlfetch.GET, deadline=20)
     user_data = json.loads(url.content)
     url = urlfetch.fetch("https://graph.facebook.com/me/friends?access_token=" + access_token, method=urlfetch.GET, deadline=20)
     facebook_data = json.loads(url.content)
     message = mail.EmailMessage(sender="Birthdays Update<*****@*****.**>",
                                 subject="Your birthday fellas")
     message.to = email
     try:
         facebook_data['data']
     except:
         message.body = """
         Hi there,
         There seems to be a problem with your account.
         
         """
         try:
             facebook_data['error']
         except:
             message.body += "We'll try to resolve it as soon as possible"
         else:
             if facebook_data['error']['code'] == 190 and facebook_data['error']['error_subcode'] == 463:
                 message.body += "Your access token is invalid. In order to use the Birthday reminder you will have to subscribe again"
             else:
                 message.body += "We'll try to resolve it as soon as possible"
         logging.info(facebook_data)
         message.send()
         logging.info("Message sent to " + str(email))
         user = Users.all().filter("email = ", email)
         db.delete(user)
         logging.info("User with email - " + email + " deleted")
     else:
         url = urlfetch.fetch("https://graph.facebook.com/me?access_token=" + access_token, method=urlfetch.GET, deadline=20)
         user_data = json.loads(url.content)
         birthday_list = ""
         birtday_list_html = ""
         now = datetime.datetime.now()
         current_date = now.strftime("%m/%d")
         message.body = "Hi there,\n"
         message.html ='<h3 style="margin:0; padding:0; font-weight:100">Hello '+user_data['name']+',</h4>'
         message.html +='<h4 style="color: #2da3bd; margin:10px 0; padding:0">Birthdays Today</h3>'
         
         for friend in facebook_data['data']:
             url = urlfetch.fetch("https://graph.facebook.com/" + friend['id'] + "?access_token=" + access_token, method=urlfetch.GET, deadline=20)
             friend_info = json.loads(url.content)
             try:
                 friend_info['birthday']
             except:
                 pass
             else:
                 birthday = friend_info['birthday'][:5]
                 if birthday == current_date:
                     birthday_list += friend_info['name'] + " - Bday: " + friend_info['birthday'] + "\n"
                     birthday_list += "Write on " + friend_info['first_name'] + "'s wall -" + friend_info['link'] + "\n\n"
                     birtday_list_html += '<div style="background: #e6e6e6; margin-top: 10px; color: #2b81c5; position: relative; padding: 10px; width: 300px; overflow: hidden;">'
                     birtday_list_html += '<img style="margin-left:auto; margin-right:auto; float:left; height:60px; width:auto;" src="https://graph.facebook.com/'+friend_info['id']+'/picture">'
                     birtday_list_html += '<div style="float: left; margin-left: 10px; margin-top:10px">'
                     birtday_list_html += '<p style="margin: 0; padding: 0; font-size:16px; font-family: Times New Romman serif;">'+friend_info['name']+'</p>'
                     birtday_list_html += '<p style="margin: 0; padding: 0; font-size:16px; font-family: Times New Romman serif;"><a href="'+friend_info['link']+'" style="color: #8e8e8e;">Write on '+friend_info['first_name']+'\'s wall</a></p>'
                     birtday_list_html += '</div></div>'
         if birthday_list != "":
             message.body += "Today the people with birthdays are:\n\n" + birthday_list
             message.html += birtday_list_html
             message.send()