def check_logged_in (self, min_perms) :

        if not FlickrAppRequest.check_logged_in(self, min_perms) :
            return False

        settings = Settings.get_settings_for_user(self.user.nsid)
        self.settings = settings
        
        return True
    def get(self, page=None):

        if not page:
            page = 1

        page = int(page)
        per_page = 10

        offset = (page - 1) * per_page

        res = dbFlickrUser.all().order("-created")
        count = res.count()

        users = res.fetch(per_page, offset)

        perms = dict([(v, k) for (k, v) in self.perms_map.iteritems()])

        for u in users:
            u.settings = Settings.get_settings_for_user(u.nsid)
            u.opted_out = Membership.has_user_opted_out(u.nsid)

            u.created_ymd = u.created.date
            u.perms_str = perms[u.perms]

            u.count_suggested_for = Suggestion.count_suggestions_for_user(
                u.nsid)

            u.count_suggested_by = Suggestion.count_suggestions_by_user(u.nsid)
            u.count_suggested_by_approved = Suggestion.count_suggestions_by_user(
                u.nsid, 2)
            u.count_suggested_by_rejected = Suggestion.count_suggestions_by_user(
                u.nsid, 3)

        pages = math.ceil(float(count) / float(per_page))

        if pages > page:
            self.assign("next", page + 1)

        if page > 1:
            self.assign("prev", page - 1)

        self.assign("count", count)
        self.assign("pages", pages)
        self.assign("page", page)
        self.assign("per_page", per_page)
        self.assign("offset", offset)

        self.assign("users", users)
        self.display("admin_users.html")
        return
    def get (self, page=None) :

        if not page :
            page = 1

        page = int(page)
        per_page = 10

        offset = (page - 1) * per_page
        
        res = dbFlickrUser.all().order("-created")
        count = res.count()
        
        users = res.fetch(per_page, offset)

        perms = dict([(v, k) for (k, v) in self.perms_map.iteritems()])
        
        for u in users :
            u.settings = Settings.get_settings_for_user(u.nsid)
            u.opted_out = Membership.has_user_opted_out(u.nsid)

            u.created_ymd = u.created.date
            u.perms_str = perms[ u.perms ]
            
            u.count_suggested_for = Suggestion.count_suggestions_for_user(u.nsid)
            
            u.count_suggested_by = Suggestion.count_suggestions_by_user(u.nsid)
            u.count_suggested_by_approved = Suggestion.count_suggestions_by_user(u.nsid, 2)
            u.count_suggested_by_rejected = Suggestion.count_suggestions_by_user(u.nsid, 3)            
            
        pages = math.ceil(float(count) / float(per_page))
        
        if pages > page :
            self.assign("next", page + 1)

        if page > 1 : 
            self.assign("prev", page - 1)
        
        self.assign("count", count)
        self.assign("pages", pages)        
        self.assign("page", page)
        self.assign("per_page", per_page)
        self.assign("offset", offset)
        
        self.assign("users", users)
        self.display("admin_users.html")
        return
Exemple #4
0
    def run (self) :

        required = ('crumb',)

        if not self.ensure_args(required) :
            return

        if not self.ensure_crumb('method=disable_email') :
            return

        settings = Settings.get_settings_for_user(self.user.nsid)

        if not settings :
            self.api_error(1, 'Unable to load user settings')
            return

        settings.email_address = ''
        settings.email_notifications = False
        settings.put()

        self.api_ok()
        return
Exemple #5
0
    def run(self):

        required = ('crumb', )

        if not self.ensure_args(required):
            return

        if not self.ensure_crumb('method=disable_email'):
            return

        settings = Settings.get_settings_for_user(self.user.nsid)

        if not settings:
            self.api_error(1, 'Unable to load user settings')
            return

        settings.email_address = ''
        settings.email_notifications = False
        settings.put()

        self.api_ok()
        return
Exemple #6
0
    def run (self) :

        required = ('crumb',)

        if not self.ensure_args(required) :
            return

        if not self.ensure_crumb('method=enable_comments') :
            return

        #
        
        settings = Settings.get_settings_for_user(self.user.nsid)

        if not settings :
            self.api_error(2, 'Unable to load user settings')
            return
        
        settings.comment_notifications = True
        settings.put()

        self.api_ok()
        return
Exemple #7
0
    def run (self) :

        required = ('crumb', 'photo_id', 'owner_id', 'latitude', 'longitude')

        if not self.ensure_args(required) :
            return

        #
        # Context
        #

        geo_context = self.request.get('geo_context')

        if geo_context :

            geo_context = int(geo_context)

            if not geo_context in (0, 1, 2) :
                self.api_error(3, 'Not a valid geo context')
                return
        else :

            geo_context = 0

        #
        #
        #

        if not self.ensure_crumb('method=suggest') :
            return

        owner_nsid = self.request.get('owner_id')
        photo_id = long(self.request.get('photo_id'))

        #
        # Blocked?
        #

        if Blocked.is_user_blocked(self.user.nsid, owner_nsid) :
            self.api_error(3, 'You do not have permission to suggest a location for this photo.')
            return

        #
        # Opted out
        #

        if Membership.has_user_opted_out(owner_nsid) :
            self.api_error(4, 'You do not have permission to suggest a location for this photo.')
            return

        #
        # Already suggested?
        # This query will probably need to be less blunt
        #

        if Suggestion.has_pending_suggestions(photo_id, self.user.nsid) :
            self.api_error(999, 'Already suggested')
            return

        lat = float(self.request.get('latitude'))
        lon = float(self.request.get('longitude'))
        acc = int(self.request.get('accuracy'))
        woeid = self.request.get('woeid')

        if woeid != '' :
            woeid = int(woeid)

        #
        # grab the photo
        #

        method = 'flickr.photos.getInfo'

        args = {
            'photo_id' : photo_id,
        }

        rsp = self.proxy_api_call(method, args)

        #
        # Recordify!
        #

        owner_nsid = self.request.get('owner_id')

        args = {
            'photo_id' : photo_id,
            'owner_id' : owner_nsid,
            'latitude' : lat,
            'longitude' : lon,
            'accuracy' : acc,
            'woeid' : woeid,
            'suggestor_id' : self.user.nsid,
            'suggestor_name' : self.user.username,
            'context' : geo_context,
        }

        s = Suggestion.create(args)

        if not s :

            msg = "failed to add suggestion for %s" % str(args)
            self.log(msg, 'warning')

            self.api_error(2, 'There was a problem recording your suggestion.')
            return

        #
        # Notifications?
        #

        review_link = "%s/review/%s" % (self.request.host_url, photo_id)

        settings = Settings.get_settings_for_user(owner_nsid)

        if settings and settings.email_notifications :

            to_addr = settings.email_address
            subject = 'You have a new suggestion for one of your photos!'
            body = """Greetings from the Suggestify project!

Flickr user %s has suggested a location for your photo "%s".

To approve or reject this suggestion, follow the link below:

%s

(If you're tired of getting these email messages you can always disable email
notifications by going to: %s/settings/notifications)

Cheers,
            """ % (self.user.username, rsp['photo']['title']['_content'], review_link, self.request.host_url)

            Email.send(to=to_addr, subject=subject, body=body)

        #
        # Post comment to the photo on Flickr?
        #

        send_comment = False

        if config.config['notifications_flickr_comments'] and settings.comment_notifications :
            send_comment = True

        if self.user.perms != 2:
            send_comment = False
            self.log('not setting a comment; insufficient perms', 'info')

        if send_comment:

            # Do not display the lat,lon in the commment since they
            # are public for anyone to see. Only display WOE ID and name,
            # if we can find them.

            is_at = ""

            if woeid :

                method = 'flickr.places.getInfo'
                args = {'woe_id' : woeid}

                rsp = self.proxy_api_call(method, args)

                if rsp and rsp['stat'] == 'ok' and rsp.has_key('place') :
                    # note the trailing space at the end

                    is_at = """I think it was taken somewhere around: <a href="http://www.flickr.com/places/%s">%s</a>. """ % (woeid, rsp['place']['name'])

            # build the comment

            comment = """I've suggested a location for this photo over at the <a href="http://suggestify.appspot.com">Suggestify</a> project.

%sYou can see the exact location and approve or reject this suggestion by following this link:

<a href="%s">%s</a>

If you do approve the suggestion then your photo will be automagically geotagged!

(You can also <a href="http://suggestify.appspot.com/settings">configure Suggestify</a> to stop these notifications from being added to your photos or to prevent any of your photos from being "suggestified" at all in the future.)
""" % (is_at, review_link, review_link)

            # post the comment

            method = 'flickr.photos.comments.addComment'

            args = {
                'photo_id' : photo_id,
                'comment_text' : comment,
                'auth_token' : self.user.token,
                }

            rsp = self.api_call(method, args)

            # what is the right way to notify the user that
            # suggestion was recorded by the comment was not?

            if rsp and rsp['stat'] == 'ok':
                comment_id = rsp['comment']['id']
                s.comment_id = comment_id
                s.put()

            else :
                msg = 'Failed to post review comment: '

                if rsp :
                    msg += rsp['message']

                self.log(msg, 'warning')

        #
        # OKAY!
        #

        self.api_ok()
        return
Exemple #8
0
    def run (self) :

        required = ('crumb', 'photo_id', 'owner_id', 'latitude', 'longitude')

        if not self.ensure_args(required) :
            return 

        #
        # Context
        #

        geo_context = self.request.get('geo_context')

        if geo_context :

            geo_context = int(geo_context)
            
            if not geo_context in (0, 1, 2) :
                self.api_error(3, 'Not a valid geo context')
                return
        else :

            geo_context = 0

        #
        #
        #
        
        if not self.ensure_crumb('method=suggest') :
            return

        owner_nsid = self.request.get('owner_id')
        photo_id = long(self.request.get('photo_id'))
        
        #
        # Blocked?
        #
    
        if Blocked.is_user_blocked(self.user.nsid, owner_nsid) :
            self.api_error(3, 'You do not have permission to suggest a location for this photo.')
            return

        #
        # Opted out
        #
        
        if Membership.has_user_opted_out(owner_nsid) :
            self.api_error(4, 'You do not have permission to suggest a location for this photo.')
            return
        
        #
        # Already suggested?
        # This query will probably need to be less blunt
        #

        if Suggestion.has_pending_suggestions(photo_id, self.user.nsid) :
            self.api_error(999, 'Already suggested')
            return

        lat = float(self.request.get('latitude'))
        lon = float(self.request.get('longitude'))
        acc = int(self.request.get('accuracy'))
        woeid = self.request.get('woeid')

        if woeid != '' :
            woeid = int(woeid)
            
        #
        # grab the photo
        #

        method = 'flickr.photos.getInfo'
        
        args = {
            'photo_id' : photo_id,
        }
        
        rsp = self.proxy_api_call(method, args)
        
        #
        # Recordify!
        #
        
        owner_nsid = self.request.get('owner_id')
        
        args = {
            'photo_id' : photo_id,
            'owner_id' : owner_nsid,
            'latitude' : lat,
            'longitude' : lon,
            'accuracy' : acc,
            'woeid' : woeid,
            'suggestor_id' : self.user.nsid,
            'suggestor_name' : self.user.username,
            'context' : geo_context,
        }

        s = Suggestion.create(args)
        
        if not s :

            msg = "failed to add suggestion for %s" % str(args)
            self.log(msg, 'warning')
            
            self.api_error(2, 'There was a problem recording your suggestion.')
            return

        #
        # Notifications?
        #

        review_link = "%s/review/%s" % (self.request.host_url, photo_id)
            
        settings = Settings.get_settings_for_user(owner_nsid)

        if settings and settings.email_notifications :
            
            to_addr = settings.email_address
            subject = 'You have a new suggestion for one of your photos!'
            body = """Greetings from the Suggestify project!

Flickr user %s has suggested a location for your photo "%s".

To approve or reject this suggestion, follow the link below:

%s

(If you're tired of getting these email messages you can always disable email
notifications by going to: %s/settings/notifications)

Cheers,
            """ % (self.user.username, rsp['photo']['title']['_content'], review_link, self.request.host_url)

            Email.send(to=to_addr, subject=subject, body=body)

        #
        # Post comment to the photo on Flickr?
        #

        if config.config['notifications_flickr_comments'] and settings.comment_notifications  :

            # Do not display the lat,lon in the commment since they
            # are public for anyone to see. Only display WOE ID and name,
            # if we can find them. 

            is_at = ""
            
            if woeid :

                method = 'flickr.places.getInfo'
                args = {'woe_id' : woeid}

                rsp = self.proxy_api_call(method, args)

                if rsp and rsp['stat'] == 'ok' and rsp.has_key('place') :
                    # note the trailing space at the end
                    
                    is_at = """I think it was taken somewhere around: <a href="http://www.flickr.com/places/%s">%s</a>. """ % (woeid, rsp['place']['name'])
                    
            # build the comment
            
            comment = """I've suggested a location for this photo over at the <a href="http://suggestify.appspot.com">Suggestify</a> project.

%sYou can see the exact location and approve or reject this suggestion by following this link:

<a href="%s">%s</a>

If you do approve the suggestion then your photo will be automagically geotagged!

(You can also <a href="http://suggestify.appspot.com/settings">configure Suggestify</a> to stop these notifications from being added to your photos or to prevent any of your photos from being "suggestified" at all in the future.)
""" % (is_at, review_link, review_link)

            # post the comment
            
            method = 'flickr.photos.comments.addComment'
            
            args = {
                'photo_id' : photo_id,
                'comment_text' : comment,
                'auth_token' : self.user.token,
                }

            rsp = self.api_call(method, args)

            # what is the right way to notify the user that
            # suggestion was recorded by the comment was not?
            
            if rsp and rsp['stat'] :
                comment_id = rsp['comment']['id']
                s.comment_id = comment_id
                s.put()
                
            else :
                msg = 'Failed to post review comment: '

                if rsp :
                    msg += rsp['message']
                    
                self.log(msg, 'warning')
                
        #
        # OKAY!
        #
        
        self.api_ok()
        return
Exemple #9
0
    def run (self) :

        required = ('crumb', 'email')

        if not self.ensure_args(required) :
            return

        if not self.ensure_crumb('method=enable_email') :
            return

        email = self.request.get('email')
        
        if not Email.is_valid_address(email) :
            self.api_error(1, 'Invalid email address')
            return

        #
        
        settings = Settings.get_settings_for_user(self.user.nsid)

        if not settings :
            self.api_error(2, 'Unable to load user settings')
            return
        
        # la la la - I can't hear you.
        
        if email == settings.email_address :
            self.api_ok()
            return
        
        #

        confirmation_code = self.generate_confirmation_code(12)

        settings.email_address_pending = email
        settings.email_confirmation_code = confirmation_code
        settings.put()
        
        # 

        confirmation_url = "%s/confirm/e/%s" % (self.request.host_url, confirmation_code)
                
        subject = "The Suggestify project would like you to confirm something"
        body = """Greetings from Suggestify project!
        
You've asked to be notified by email when someone adds a new suggestion
to one of your photos.

If you didn't ask for this, or simply don't remember asking, to be notified
the best thing to do is to ignore this email entirely. You can always ask
again when you're ready

Otherwise, click on the link below to finish setting up your email address
for notifications!

%s

Cheers,
        """ % confirmation_url

        if not Email.send(to=email, subject=subject, body=body) :
            self.api_error(3, 'There was a problem delivering email')
            return
        
        self.api_ok()
        return
Exemple #10
0
    def run(self):

        required = ('crumb', 'email')

        if not self.ensure_args(required):
            return

        if not self.ensure_crumb('method=enable_email'):
            return

        email = self.request.get('email')

        if not Email.is_valid_address(email):
            self.api_error(1, 'Invalid email address')
            return

        #

        settings = Settings.get_settings_for_user(self.user.nsid)

        if not settings:
            self.api_error(2, 'Unable to load user settings')
            return

        # la la la - I can't hear you.

        if email == settings.email_address:
            self.api_ok()
            return

        #

        confirmation_code = self.generate_confirmation_code(12)

        settings.email_address_pending = email
        settings.email_confirmation_code = confirmation_code
        settings.put()

        #

        confirmation_url = "%s/confirm/e/%s" % (self.request.host_url,
                                                confirmation_code)

        subject = "The Suggestify project would like you to confirm something"
        body = """Greetings from Suggestify project!
        
You've asked to be notified by email when someone adds a new suggestion
to one of your photos.

If you didn't ask for this, or simply don't remember asking, to be notified
the best thing to do is to ignore this email entirely. You can always ask
again when you're ready

Otherwise, click on the link below to finish setting up your email address
for notifications!

%s

Cheers,
        """ % confirmation_url

        if not Email.send(to=email, subject=subject, body=body):
            self.api_error(3, 'There was a problem delivering email')
            return

        self.api_ok()
        return