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
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