Beispiel #1
0
    def search(self):
        self.clean()

        sqs = SearchQuerySet()
        user = self.user
        query = self.cleaned_data['q']

        # check to see if there is impersonation
        if hasattr(user,'impersonated_user'):
            if isinstance(user.impersonated_user, User):
                user = user.impersonated_user
                
        is_an_admin = is_admin(user)
        
        # making a special case for corp memb because it needs to utilize two settings
        # (anonymoussearchcorporatemembers and membersearchcorporatemembers)
        if CorpMemb and self.cleaned_data['models'] == ["%s.%s" % (CorpMemb._meta.app_label, 
                                                                   CorpMemb._meta.module_name)]:
            filter_and, filter_or = CorpMemb.get_search_filter(user)
            q_obj = None
            if filter_and:
                q_obj = Q(**filter_and)
            if filter_or:
                q_obj_or = reduce(operator.or_, [Q(**{key: value}) for key, value in filter_or.items()])
                if q_obj:
                    q_obj = reduce(operator.and_, [q_obj, q_obj_or])
                else:
                    q_obj = q_obj_or
            if q_obj:
                sqs = sqs.filter(q_obj)
            
            if query:
                sqs = sqs.auto_query(sqs.query.clean(query)) 
        else:
            
            if query:
                sqs = sqs.auto_query(sqs.query.clean(query)) 
                if user:
                    if not is_an_admin:
                        if not user.is_anonymous():
                        # if b/w admin and anon
    
                            # (status+status_detail+(anon OR user)) OR (who_can_view__exact)
                            anon_query = Q(**{'allow_anonymous_view':True,})
                            user_query = Q(**{'allow_user_view':True,})
                            sec1_query = Q(**{
                                'status':1,
                                'status_detail':'active',
                            })
                            sec2_query = Q(**{
                                'owner__exact':user.username
                            })
                            query = reduce(operator.or_, [anon_query, user_query])
                            query = reduce(operator.and_, [sec1_query, query])
                            query = reduce(operator.or_, [query, sec2_query])
    
                            sqs = sqs.filter(query)
                        else:
                        # if anonymous
                            sqs = sqs.filter(status=1).filter(status_detail='active')
                            sqs = sqs.filter(allow_anonymous_view=True)
                else:
                    # if anonymous
                    sqs = sqs.filter(status=1).filter(status_detail='active')
                    sqs = sqs.filter(allow_anonymous_view=True)
            else:
                if user:
                    if is_an_admin:
                        sqs = sqs.all()
                    else:
                        if not user.is_anonymous():
                            # (status+status_detail+anon OR who_can_view__exact)
                            sec1_query = Q(**{
                                'status':1,
                                'status_detail':'active',
                                'allow_anonymous_view':True,
                            })
                            sec2_query = Q(**{
                                'owner__exact':user.username
                            })
                            query = reduce(operator.or_, [sec1_query, sec2_query])
                            sqs = sqs.filter(query)
                        else:
                            # if anonymous
                            sqs = sqs.filter(status=1).filter(status_detail='active')
                            sqs = sqs.filter(allow_anonymous_view=True)               
                else:
                    # if anonymous
                    sqs = sqs.filter(status=1).filter(status_detail='active')
                    sqs = sqs.filter(allow_anonymous_view=True)

            sqs = sqs.order_by('-create_dt')
        
        if self.load_all:
            sqs = sqs.load_all()
        
        return sqs
Beispiel #2
0
def new_corp_mems_from_csv(request, file_path, corp_app, columns, update_option='skip'):
    """
    Create corporatemembership objects (not in database)
    CorporateMembership objects are based on the import csv file
    An extra field called columns can be passed in for field mapping
    A corporate membership application is required
    """
    from corporate_memberships.models import CorporateMembershipType, CorporateMembership
    corp_memb_dicts = []
    for csv_dict in csv_to_dict(file_path):  # field mapping
        corp_memb_dict = {}
        for native_column, foreign_column in columns.items():
            if foreign_column: # skip if column not selected
                corp_memb_dict[native_column] = csv_dict[foreign_column]

        corp_memb_dicts.append(corp_memb_dict)

    corp_memb_set = []
    corp_memb_field_names = [smart_str(field.name) for field in CorporateMembership._meta.fields]
    corp_memb_field_types =  [field.__class__.__name__ for field in CorporateMembership._meta.fields]
    corp_memb_field_type_dict = dict(zip(corp_memb_field_names, corp_memb_field_types))

    processed_names = []
    for cm in corp_memb_dicts:
        is_valid = True
        err_msg = ''
        
        try:
            name = cm['name']
        except:
            name = None
            is_valid = False
            err_msg = "Name is blank"
            
        if name in processed_names:
            err_msg = 'Duplicates - the record with the same name "%s" already exists.' % name
            is_valid = False
        else:
            processed_names.append(name)
            
        if is_valid:
            try:
                corp_memb = CorporateMembership.objects.get(name=name)
            except CorporateMembership.DoesNotExist:
                    corp_memb = CorporateMembership(
                        name=name,
                        creator=request.user,
                        creator_username=request.user.username,
                        owner=request.user,
                        owner_username=request.user.username
                    )
        else:
            corp_memb = CorporateMembership(name=name)

        corp_memb.is_valid = is_valid
        corp_memb.err_msg = err_msg

        try:  # if membership type exists
            corp_memb_type = CorporateMembershipType.objects.get(name=cm['corporate_membership_type'])
            corp_memb.corporate_membership_type = corp_memb_type
        except:
            corp_memb_type  = None
            corp_memb.is_valid = False
            corp_memb.err_msg += "Corporate membership type '%s' does not exist." % cm.get('corporate_membership_type')

        corp_memb.cm = cm

        if (not corp_memb.is_valid) or (corp_memb.pk and update_option=='skip'):
            corp_memb_set.append(corp_memb)
            continue    # stop processing if not valid 
                        # or if 'skip' is the update option and the record exists

        # for each field in the corporate membership, assign the value accordingly
        for field_name in corp_memb_field_names:
            if cm.has_key(field_name):
                if corp_memb_field_type_dict[field_name] == 'DateTimeField':

                    # if (empty cell) and (field in renew_dt, expiration_dt)
                    if (not cm[field_name]) and field_name in ['renew_dt', 'expiration_dt']:
                        pass # skip for 'join_dt', 'expiration_dt' - we don't want to auto-assign today's date
                    else:
                        try:
                            # maybe need to skip the expiration_dt if expiration_dt is None
                            tm = (dparser.parse(cm[field_name])).timetuple() 
                            cm[field_name] = datetime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec)
                        except:
                            pass

                if corp_memb_field_type_dict[field_name] == 'BooleanField':
                    cm[field_name] = bool(cm[field_name])
                if corp_memb_field_type_dict[field_name] == 'IntegerField':
                    try:
                        cm[field_name] = int(cm[field_name])
                    except:
                        cm[field_name] = 0
                        
                if corp_memb.pk:      
                    old_value = getattr(corp_memb, field_name)
                else:
                    old_value = None
                
                if corp_memb.pk and update_option == 'update' and old_value:
                    # this is an existing record but the field is not blank 
                    pass
                else:
                    try:
                        setattr(corp_memb, field_name, cm[field_name])
                    except ValueError:
                        pass
            else:
                if corp_memb_field_type_dict[field_name] == 'CharField':
                    setattr(corp_memb, field_name, unicode())

        if corp_memb.renew_dt:
            if not corp_memb.renewal:
                corp_memb.renewal = 1
        else:
            corp_memb.renew_dt = None
            corp_memb.renewal = 0
                
        if not corp_memb.join_dt:
            corp_memb.join_dt = datetime.now()

        corp_memb.expiration_dt = cm.get('expiration_dt')

        if not corp_memb.expiration_dt:
            corp_memb.expiration_dt = corp_memb_type.get_expiration_dt(
                join_dt=corp_memb.join_dt,
                renew_dt=corp_memb.renew_dt,
                renewal=corp_memb.renewal
            )

        if not corp_memb.pk:
            corp_memb.corp_app = corp_app 
            corp_memb.status = bool(cm.get('status', True))
            corp_memb.status_detail = cm.get('status-detail', 'active')
  
        if not corp_memb.secret_code:
            corp_memb.assign_secret_code()

        corp_memb_set.append(corp_memb)
        
    return corp_memb_set