Ejemplo n.º 1
0
 def googleauth(self,id=0):
     """
     User is coming in from google, should have an auth token
     """
     # NEED SITE????  Or does that not make sense?
     import gdata
     import gdata.contacts
     import gdata.contacts.service
     authsub_token = self.get_argument("token")
     log.info('calling gdata_authsubtoke = %s' % (authsub_token))
     #TODO:  upgrade to gdata 1.2+ which breaks this
     gd_client = gdata.contacts.service.ContactsService()
     gd_client.auth_token = authsub_token
     gd_client.UpgradeToSessionToken()
     query = gdata.contacts.service.ContactsQuery()
     query.max_results = 2
     feed = gd_client.GetContactsFeed(query.ToUri())
     email = feed.author[0].email.text
     name = feed.author[0].name.text
     user = meta.DBSession.query(Person).filter_by(
                 email=email.lower()).first()
     if not user:
         user = Person(site_id=1,email=email,displayname=name)
         user.authn = 'google'
         user.save()
         log.info('creating a google user')
     self.set_current_user(user,is_authenticated = True,islogon=True)
     expires_seconds = 60*60*24*31
     self.set_cookie('dsuserkey', user.user_uniqueid,expires_days=31)
     if 'url' in self.request.arguments:
         url = request.GET['url']
         self.redirect(str(url))
     self.render('/comment/comment_login.html')
Ejemplo n.º 2
0
 def inviteusers_POST(self,id=0):
     """
     admin is sending out a number of invites to users
     """
     raise Exception("not implemented")
     if 'emails' in self.request.arguments:
         emails = self.get_argument("emails")
         delay = 4
         from demisauce.lib import scheduler
         for email in emails.split(','):
             email = email.strip().lower()
             user = Person.by_email(self.user.site_id,email)
             
             if user is None:
                 user = Person(site_id=c.site_id,email=email, displayname=email)
                 user.save()
                 #send emails
                 url2 = urllib.quote_plus('/user/viewh/%s' % (user.hashedemail))
                 dnew = {}
                 dnew['link'] = '%s/user/verify?unique=%s&node=%s&return_url=%s' %\
                     (base_url(),user.user_uniqueid,user.id,url2)
                 dnew['from'] = self.user.displayname
                 a = Activity(site_id=user.site_id,person_id=user.id,activity='sending email invite')
                 a.ip = self.request.remote_ip 
                 a.ref_url = 'account admin invite'
                 a.category = 'account'
                 a.save()
                 scheduler.add_interval_task(send_emails,0,('invitation_to_demisauce',[user.email],dnew) , initialdelay=delay)
                 delay += 3
             
         return 'from form %s' % emails
     return 'error'
Ejemplo n.º 3
0
 def interest(self,id=0):
     """
     User has selected to enter an email to be on waitinglist
     """
     
     log.debug(self.request.arguments)
     form = SignupForm(QueryDict(self.request.arguments))
     log.debug(form.data)
     if 'email' in self.request.arguments and form.validate():
         user = meta.DBSession.query(Person).filter_by(
                 email=self.get_argument("email").lower()).first()
         
         if user is None:
             new_email = form.email.data.lower()
             site = Site(name=new_email,email=new_email)
             site.save()
             user = Person(site_id=site.id,email=new_email,
                           displayname=new_email)
             user.slug = user.hashedemail
             user.save()
             a = Activity(site_id=user.site_id,person_id=user.id,activity='Signup Interest Form')
             #a.ref_url = 'comment url'
             a.ip = self.request.remote_ip 
             a.category = 'account'
             a.save()
             
             link = '%s/user/verify?unique=%s&node=%s&return_url=%s' %\
                 (options.base_url,
                     user.user_uniqueid,
                     user.id,
                     urllib.quote_plus('/user/viewh/%s' % (user.hashedemail)))
             json_dict = {
                 'emails':[user.email],
                 'template_name':'thank_you_for_registering_with_demisauce',
                 'template_data':{
                     'link':link,
                     'displayname':user.displayname,
                     'email':user.email,
                     'title':'welcome'
                 }
             }
             self.db.gearman_client.do_task(Task("email_send",json.dumps(json_dict), background=True))
             
         self.add_alert("Thank You!")
         self.redirect("/")
     
     return self.render('/user/signup.html',form=form)
Ejemplo n.º 4
0
class PersonApiHandler(ApiSecureHandler):
    object_cls = Person
    def after_save(self,data_dict):
        if hasattr(self.object,'is_new') and self.object.is_new:
            self._queue_actions.update({'new_user':{'user_id':self.object.id}})
    
    def object_load_dict(self,o,data_dict):
        'http post handle args'
        if 'attributes' in data_dict:
            attr_list = []
            if isinstance(data_dict['attributes'],list):
                attr_list = data_dict['attributes']
            elif isinstance(data_dict['attributes'],dict):
                attr_list = [data_dict['attributes']]
            for attr in attr_list:
                object_type = "attribute" if not 'object_type' in attr else attr['object_type']
                category = "attribute"  if not 'category' in attr else attr['category']
                encoding = 'str' if not 'encoding' in attr else attr['encoding']
                o.add_attribute(attr['name'],attr['value'],object_type=object_type,
                    encoding=encoding,category=category)
            data_dict.pop('attributes')
        if 'delete_attributes' in data_dict:
            for attr in data_dict['delete_attributes']:
                ua = o.get_attribute(attr['name'])
                log.debug('deletting attribute = id=%s, name=%s' % (ua.id, ua.name))
                ua.delete()
            data_dict.pop('delete_attributes')
        return data_dict
    
    def change_email(self):
        self.handle_post()
    
    def delete_by_get(self):
        self.action_get_object(self.id)
        if self.object and hasattr(self.object,'delete'):
            url = self.request.full_url()
            log.debug("DELETE id=%s for url=%s" % (self.id,url))
            self.object.delete()
            cache.cache.delete(cache.cache_key(url))
            self.object = None
            self.qry = []
            self.set_status(204)
        else:
            log.error("not found?   %s, %s" % (self.noun, self.id))
    
    def action_get_object(self,id, data_dict = {}):
        if isinstance(self.id,int) and self.id > 0:
            #meta.DBSession.close()
            #meta.DBSession()
            self.object = Person.get(self.site.id,self.id)
            if not self.object:
                # ??
                self.object = Person.by_foreignid(self.site.id,self.id)
        elif isinstance(self.id,int) and self.id == 0 and 'email' in data_dict:
            self.object = Person.by_email(self.site.id,data_dict['email'].lower())
        elif 'foreign_id' in data_dict:
            self.object = Person.by_foreignid(self.site.id,data_dict['foreign_id'])
        else:
            id = urllib.unquote_plus(self.id)
            if mailsrch.match(id):
                self.object = Person.by_email(self.site.id,id)
            else:
                self.object = Person.by_hashedemail(self.site.id,id)
            log.debug('getting by hashed/email:  %s, %s' % (id, self.object))
        if self.object:
            self.qry = [self.object]
    
    def json_formatter(self,o):
        if o:
            return o.to_dict_api()
        return None
    
    def action_get_list(self,q=None):
        if q:
            qry = self.db.session.query(Person).filter(and_(
                Person.name.like('%' + q + '%'),Person.is_anonymous==1))
        else:
            qry = self.db.session.query(Person).filter(and_(Person.site_id==self.site.id))
        self.qry = qry
    
    def pre_init_user(self):
        """A push to pre-initiate session (step 1) optional
        body of json to add/update user"""
        user = None
        user_dict = {}
        if self.request.method == 'POST':
            if self.is_json_post():
                user_dict = json.loads(self.request.body)
            else:
                user_dict = self.args_todict()
            log.debug("Loaded data user_dict=%s" % user_dict)
            self.action_get_object(self.id, user_dict)
            if not self.object:
                log.debug("creating new user, not found %s dict=%s" % (self.id,user_dict))
                self.object = Person(site_id=self.site.id,foreign_id=self.id)
            
            if self.object:
                self.object.from_dict(user_dict,allowed_keys=Person._allowed_api_keys)
                self.object.save()
                if hasattr(self.object,'is_new') and self.object.is_new:
                    self._queue_actions.update({'new_user':{'user_id':self.object.id}})
            
        else:
            self.action_get_object(self.id)
        
        if self.object:
            user_key = self.object.id
            log.debug("setting cache = %s, %s" % (str(user_key),self.site.key))
            self.db.cache.set(str(user_key),self.site.key,120) # 2 minutes only
            site_key = self.db.cache.get(str(user_key))
            log.debug("site_key, self.site.key = %s, %s" % (site_key, self.site.key))
            assert site_key == self.site.key
            
            self.qry = [self.object]
    
    def options(self,site_slug='',format='json'):
        log.debug("in person api OPTIONS")