def edit_profile(request): """ Main profile view that the user first sees. Ultimately generates the following in data_dict: :profile_config: A dictionary of profile units :empty_display_names: A list of ProfileUnits that hasn't been made """ user = request.user user.update_profile_completion() manager = BaseProfileUnitManager(order=[ 'summary', 'name', 'employmenthistory', 'education', #'militaryservice', 'volunteerhistory', #'license', #'secondaryemail', #'website', 'endorsementinvitation', 'address' ]) profile_config = manager.displayed_units(user.profileunits_set.all()) empty_units = [model for model in ProfileUnits.__subclasses__()] for units in profile_config.itervalues(): if units[0].__class__ in empty_units: del empty_units[empty_units.index(units[0].__class__)] empty_names = [model.get_verbose_class() for model in empty_units] empty_display_names = [] for name in empty_names: name_with_space = re.sub(r"(\w)([A-Z])", r"\1 \2", name) empty_display_names.append(name_with_space) data_dict = { 'profile_config': profile_config, 'unit_names': empty_display_names, 'user': user, 'view_name': 'My Profile' } return render_to_response('myprofile/edit_profile.html', data_dict, RequestContext(request))
def edit_profile(request): """ Main profile view that the user first sees. Ultimately generates the following in data_dict: :profile_config: A dictionary of profile units :empty_display_names: A list of ProfileUnits that hasn't been made """ user = request.user user.update_profile_completion() manager = BaseProfileUnitManager( order=[ "summary", "name", "employmenthistory", "education", "militaryservice", "volunteerhistory", "license", "secondaryemail", "website", "address", ] ) profile_config = manager.displayed_units(user.profileunits_set.all()) empty_units = [model for model in ProfileUnits.__subclasses__()] for units in profile_config.itervalues(): if units[0].__class__ in empty_units: del empty_units[empty_units.index(units[0].__class__)] empty_names = [model.get_verbose_class() for model in empty_units] empty_display_names = [] for name in empty_names: name_with_space = re.sub(r"(\w)([A-Z])", r"\1 \2", name) empty_display_names.append(name_with_space) data_dict = { "profile_config": profile_config, "unit_names": empty_display_names, "user": user, "view_name": "My Profile", } return render_to_response("myprofile/edit_profile.html", data_dict, RequestContext(request))
def edit_profile(request): """ Main profile view that the user first sees. Ultimately generates the following in data_dict: :profile_config: A dictionary of profile units :empty_display_names: A list of ProfileUnits that hasn't been made """ user = request.user user.update_profile_completion() manager = BaseProfileUnitManager(order=['summary', 'name', 'employmenthistory', 'education', #'militaryservice', 'volunteerhistory', #'license', #'secondaryemail', #'website', 'endorsementinvitation', 'address']) profile_config = manager.displayed_units(user.profileunits_set.all()) empty_units = [model for model in ProfileUnits.__subclasses__()] for units in profile_config.itervalues(): if units[0].__class__ in empty_units: del empty_units[empty_units.index(units[0].__class__)] empty_names = [model.get_verbose_class() for model in empty_units] empty_display_names = [] for name in empty_names: name_with_space = re.sub(r"(\w)([A-Z])", r"\1 \2", name) empty_display_names.append(name_with_space) data_dict = {'profile_config': profile_config, 'unit_names': empty_display_names, 'user': user, 'view_name': 'My Profile'} return render_to_response('myprofile/edit_profile.html', data_dict, RequestContext(request))
def prepare_add_to_solr(sender, instance, **kwargs): """ Converts an object instance into a dictionary and adds it to solr. """ if getattr(instance, 'solr_update', None): if sender in ProfileUnits.__subclasses__(): content_type_id = ContentType.objects.get_for_model(ProfileUnits).pk object_id = instance.user_id else: content_type_id = ContentType.objects.get_for_model(sender).pk object_id = instance.pk uid = "%s##%s" % (content_type_id, object_id) obj, _ = Update.objects.get_or_create(uid=uid) obj.delete = False obj.save()
def edit_profile(request): """ Main profile view that the user first sees. Ultimately generates the following in data_dict: :profile_config: A dictionary of profile units :empty_display_names: A list of ProfileUnits that hasn't been made """ user = request.user user.update_profile_completion() manager = BaseProfileUnitManager(order=['social','basicinfo','skill','experience','education']) profile_config = manager.displayed_units(user.profileunits_set.all()) empty_units = [model for model in ProfileUnits.__subclasses__()] for units in profile_config.iteritems(): if units[0].__class__ in empty_units: del empty_units[empty_units.index(units[0].__class__)] empty_names = [model.get_verbose_class() for model in empty_units] empty_display_names = [] for name in empty_names: name_with_space = re.sub(r"(\w)([A-Z])", r"\1 \2", name) empty_display_names.append(name_with_space) data_dict = {'profile_config': profile_config, 'unit_names': empty_display_names, 'user': user, 'view_name': 'My Profile', 'can_edit':True, } return render_to_response('myprofile/edit_profile.html', data_dict, RequestContext(request))
def prepare_delete_from_solr(sender, instance, **kwargs): """ Removes and object instance from solr. """ if sender in ProfileUnits.__subclasses__(): content_type_id = ContentType.objects.get_for_model(ProfileUnits).pk object_id = instance.user_id # If there are existing ProfileUnits for a user, since all ProfileUnits # are in the same solr document, update the document rather than # removing it. if ProfileUnits.objects.filter(user_id=instance.user_id).exclude(pk=instance.pk): prepare_add_to_solr(sender, instance, **kwargs) return else: content_type_id = ContentType.objects.get_for_model(sender).pk object_id = instance.pk uid = "%s##%s" % (content_type_id, object_id) obj, _ = Update.objects.get_or_create(uid=uid) obj.delete = True obj.save()
def handle(self, *args, **options): models = ProfileUnits.__subclasses__() models.append(User) models.append(SavedSearch) schema_fields = [] copy_fields = [] if options['static']: # One-off fields schema_fields.append({ 'field_name': 'ProfileUnits_user_id', 'type': 'long', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', }) schema_fields.append({ 'field_name': 'Address_full_location', 'type': 'string', 'indexed': 'true', 'stored': 'true', 'multiValued': 'true', }) schema_fields.append({ 'field_name': 'Address_region', 'type': 'string', 'indexed': 'true', 'stored': 'true', 'multiValued': 'true', }) schema_fields.append({ 'field_name': 'text', 'type': 'text_en', 'indexed': 'true', 'stored': 'false', 'multiValued': 'true', }) schema_fields.append({ 'field_name': 'SavedSearch_company_id', 'type': 'long', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', }) # Analytics for field in ['job_view_title', 'job_view_company', 'job_view_location']: exact_field = field + '_exact' field_data = { 'field_name': field, 'type': 'text_en', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', } schema_fields.append(field_data.copy()) field_data['field_name'] = exact_field field_data['type'] = 'string' schema_fields.append(field_data) copy_fields.append({'source': exact_field, 'dest': field}) for field in ['aguid', 'domain', 'job_view_canonical_domain', 'job_view_guid', 'search_location', 'search_query', 'page_category', 'doc_type']: # myguid is the same as User_user_guid and will be kept there schema_fields.append({ 'field_name': field, 'type': 'string', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', }) for field in ['view_source', 'job_view_buid', 'company_id']: schema_fields.append({ 'field_name': field, 'type': 'long', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', }) for field in ['search_keywords', 'facets', 'site_tag', 'special_commitment']: schema_fields.append({ 'field_name': field, 'type': 'string', 'indexed': 'true', 'stored': 'true', 'multiValued': 'true', }) schema_fields.append({ 'field_name': 'view_date', 'type': 'date', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', }) for model in models: for field in model._meta.fields: field_type = field.get_internal_type() # The OneToOneField fields is useless in every single case # so far. if field_type == 'OneToOneField' or \ any(s in field.attname for s in ['password', 'deactivate_type']): continue field_data = { 'field_name': "%s_%s" % (model.__name__, field.attname), 'type': 'string', 'indexed': 'true', 'stored': 'true', 'multiValued': 'false', } try: field_data['type'] = type_mapping[field_type] except KeyError: # If there's no field in the type_mapping then the # default text_en should work. pass if model in ProfileUnits.__subclasses__(): field_data['multiValued'] = 'true' schema_fields.append(field_data) context = Context({ 'default_field_name': DEFAULT_FIELD_NAME, 'unique_field_name': UNIQUE_FIELD_NAME, 'default_operator': DEFAULT_OPERATOR, 'fields': schema_fields, 'copy_fields': copy_fields }) print loader.get_template('solr_schema_base.xml').render(context)
def handle_form(request): """ Handles the user submitting changes to their user profile. The form expects a 'module' GET parameter and an optional 'item_id'. It then uses these to update the existing item or create a new instance """ item_id = request.REQUEST.get('id', 'new') module = request.REQUEST.get('module') module = module.replace(" ", "") item = None if item_id != 'new': try: item = request.user.profileunits_set.get(pk=item_id) item = getattr(item, module.lower()) except ProfileUnits.DoesNotExist: # User is trying to access a nonexistent PU # or a PU that belongs to someone else raise Http404 item_class = item.__class__ try: form = getattr(forms, module + 'Form') except KeyError: # Someone must have manipulated request data? raise Http404 data_dict = {'view_name': 'My Resume', 'item_id': item_id, 'module': module} if request.method == 'POST': if request.POST.get('action') == 'updateEmail': activation = ActivationProfile.objects.get_or_create(user=request.user, email=item.email)[0] activation.send_activation_email(primary=False) return HttpResponse('success') if item_id == 'new': form_instance = form(user=request.user, data=request.POST, auto_id=False) else: form_instance = form(user=request.user, instance=item, auto_id=False, data=request.POST) model = form_instance._meta.model data_dict['form'] = form_instance data_dict['verbose'] = model._meta.verbose_name.title() model_name = model._meta.verbose_name.lower() if form_instance.is_valid(): instance = form_instance.save() if request.is_ajax(): suggestions = ProfileUnits.suggestions(request.user) return render_to_response('myprofile/suggestions.html', {'suggestions': suggestions[:3], 'model_name': model_name, 'module': {'item': instance}}, RequestContext(request)) else: return HttpResponseRedirect(reverse('view_profile')) else: if request.is_ajax(): return HttpResponse(json.dumps(form_instance.errors), status=400) else: return render_to_response('myprofile/profile_form.html', data_dict, RequestContext(request)) else: if item_id == 'new': form_instance = form(user=request.user, auto_id=False) if data_dict['module'] == 'Summary': try: summary = request.user.profileunits_set.get( content_type__name='summary') except ProfileUnits.DoesNotExist: summary = None if summary: return HttpResponseRedirect(reverse('handle_form') + '?id='+str(summary.id) + '&module='+data_dict['module']) else: form_instance = form(instance=item, auto_id=False) if data_dict['module'] == 'SecondaryEmail': data_dict['verified'] = item.verified model = form_instance._meta.model data_dict['form'] = form_instance data_dict['verbose'] = model._meta.verbose_name.title() return render_to_response('myprofile/profile_form.html', data_dict, RequestContext(request))
def export_hr(request, candidates, export_type, models_excluded=[]): """ Generates HR-XML or HR-JSON, depending on export_type. """ time = datetime.now().strftime('%m%d%Y') company_id = request.REQUEST.get('company') try: company = Company.objects.get(id=company_id) except Company.DoesNotExist: raise Http404 models = [ model for model in ProfileUnits.__subclasses__() if model._meta.module_name not in models_excluded ] model_names = [model._meta.module_name for model in models] users_units = ProfileUnits.objects.filter( user__in=candidates).select_related('user', 'user__id', 'profileunits', 'content_type__name', *model_names) # initial dict for grouped units gu = {} for k1, v1 in groupby(users_units, lambda x: x.user): pus = [] for k2, v2 in groupby(v1, lambda x: x.content_type.name): pus.append((k2, list(v2))) pus = OrderedDict(pus) gu[k1] = pus if export_type == 'xml': root = etree.Element("candidates") for user, units in gu.items(): new_candidate = etree.SubElement(root, "candidate") etree.SubElement(new_candidate, "email").text = user.email for unit in units.values(): fields = [] if len(unit) > 1: name = unit[0].get_verbose().replace(" ", "") if str(name).endswith('y'): name = name[:-1] + "ies" elif str(name).endswith('s'): name += 'es' else: name += 's' xunit = etree.SubElement(new_candidate, name) for u in unit: instance = getattr( u, u.content_type.name.replace(" ", "")) if not fields: fields = retrieve_fields(instance) more_units = etree.SubElement( xunit, u.get_verbose().replace(" ", "")) for field in fields: value = unicode(getattr(instance, field)) etree.SubElement(more_units, field).text = value else: xunit = etree.SubElement( new_candidate, unit[0].get_verbose().replace(" ", "")) instance = getattr( unit[0], unit[0].content_type.name.replace(" ", "")) fields = retrieve_fields(instance) for field in fields: value = unicode(getattr(instance, field)) etree.SubElement(xunit, field).text = value response = HttpResponse(etree.tostring(root, pretty_print=True), mimetype='application/force-download') response['Content-Disposition'] = 'attachment; filename=' + \ company.name + "_DE_"+time+'.xml' return response elif export_type == 'json': full_json = {} user_info = {} for user, units in gu.items(): units_info = {} for unit in units.values(): fields = [] if len(unit) > 1: name = unit[0].get_verbose().replace(" ", "") if str(name).endswith('y'): name = name[:-1] + "ies" else: name += "s" model_info = {} n = 0 for model in unit: model_name = model.get_verbose().replace(" ", "") instance = getattr( model, model.content_type.name.replace(" ", "")) if not fields: fields = retrieve_fields(instance) field_info = {} for field in fields: value = unicode(getattr(instance, field)) field_info[field] = value n += 1 model_info[model_name + str(n)] = field_info units_info[name] = model_info else: name = unit[0].get_verbose().replace(" ", "") instance = getattr( unit[0], unit[0].content_type.name.replace(" ", "")) fields = retrieve_fields(instance) field_info = {} for field in fields: value = unicode(getattr(instance, field)) field_info[field] = value units_info[name] = field_info user_info[user.email] = units_info full_json['candidates'] = user_info response = HttpResponse(json.dumps(full_json, indent=4), mimetype='application/force-download') response['Content-Disposition'] = 'attachment; filename=' + \ company.name + "_DE_"+time+'.json' return response
def export_csv(request, candidates, models_excluded=[], fields_excluded=[]): """ Exports comma-separated values file. Function is seperated into two parts: creation of the header, creating user data. Header creation uses a tuple and a Counter to determine the max amount of each module type (education, employmenthistory, etc). Then the header is created in the format of [model]_[field_name]_[count] excluding models and or fields in either lists (models_excluded and fields_excluded). The header is always the first line in the csv. User data creation iterates through the list of profileunits. The profileunits are ordered_by user so when the user changes it prints the past user's row and makes a new row for the current user. Inputs: :candidates: A set list of Users :models_excluded: List of strings that represents profileunits content_type model names :fields_excluded: List of strings that would target specific fields Outputs: :response: Sends a .csv file to the user. """ response = HttpResponse(mimetype='text/csv') time = datetime.now().strftime('%m%d%Y') company_id = request.REQUEST.get('company') try: company = Company.objects.get(id=company_id) except Company.DoesNotExist: raise Http404 response['Content-Disposition'] = ('attachment; filename=' + company.name + "_DE_" + time + '.csv') writer = csv.writer(response) models = [ model for model in ProfileUnits.__subclasses__() if model._meta.module_name not in models_excluded ] model_names = [model._meta.module_name for model in models] users_units = ProfileUnits.objects.filter( user__in=candidates).select_related('user', 'user__id', 'profileunits', 'content_type__name', *model_names).order_by('user') # Creating header for CSV headers = ["primary_email"] tup = [(x.user.id, x.content_type.name) for x in users_units] tup_counter = Counter(tup) final_count = {} tup_most_common = tup_counter.most_common() for model_name in model_names: for counted_model in tup_most_common: if (counted_model[0][1].replace(" ", "") == unicode(model_name) and counted_model[0][1].replace(" ", "") not in final_count): final_count[model_name] = counted_model[1] for model in models: module_count = 0 current_count = 1 if model._meta.module_name in final_count: module_count = final_count[model._meta.module_name] while current_count <= module_count: models_with_fields = [] fields = retrieve_fields(model) for field in fields: if field not in fields_excluded: ufield = model._meta.module_name + "_" + field + "_" + str( current_count) else: continue if ufield: models_with_fields.append(ufield) headers.extend(models_with_fields) current_count += 1 writer.writerow(headers) # Making user info rows user_fields = [] temp_user = None for unit in users_units: user = unit.user continued = False num = 0 if user == temp_user: continued = True else: continued = False temp_user = user del_user_num = candidates.index(temp_user) del (candidates[del_user_num]) if not continued: if user_fields: writer.writerow(user_fields) user_fields = [user.email] # Filling in user_fields with default data whileloop = True while num > len(headers) - 1 or whileloop == True: if not len(user_fields) == len(headers): user_fields.append('""') num += 1 else: whileloop = False instance = getattr(unit, unit.content_type.name.replace(" ", "")) fields = retrieve_fields(instance) for field in fields: value = getattr(instance, field, u'') value = unicode(value).encode('utf8') # Find where to put value in user_fields n = 1 position = headers.index( unit.content_type.name.replace(" ", "") + "_" + field + "_" + str(n)) while not user_fields[position] == '""': n += 1 position = headers.index( unit.content_type.name.replace(" ", "") + "_" + field + "_" + str(n)) user_fields[position] = '"%s"' % value.replace('\r\n', '') if unit is list(users_units)[-1]: writer.writerow(user_fields) # Everyone that didn't get included from the above code, doesn't have # profileunits. Fill in user_fields with default value. for user in candidates: user_fields = [user.email] for header in headers[1:]: user_fields.append('""') writer.writerow(user_fields) return response
def view_talent(request,slug): # try: # if "next" in slug: # the_user = request.REQUEST.get('user') # user = User.objects.all() # the_user = get_next_or_prev(user, the_user, 'next') User.objects.all().order_by('email') if "next" in slug or "prev" in slug: print slug the_user = request.REQUEST.get('user') user = User.objects.all() the_user = get_next_or_prev(user, the_user, slug) if "myprofile" in slug: the_user = request.user # elif "prev" in slug: # the_user = request.REQUEST.get('user') # user = User.objects.all() # the_user = get_next_or_prev(user, the_user, slug) else: BI = Basicinfo.objects.get(slug=slug) PI = ProfileUnits.objects.get(id=BI.id) the_user = User.objects.get(id=PI.user_id) manager = BaseProfileUnitManager(order=['social','basicinfo','skill','experience','education']) print manager profile_config = manager.displayed_units(the_user.profileunits_set.all()) empty_units = [model for model in ProfileUnits.__subclasses__()] for units in profile_config.iteritems(): if units[0].__class__ in empty_units: del empty_units[empty_units.index(units[0].__class__)] empty_names = [model.get_verbose_class() for model in empty_units] empty_display_names = [] for name in empty_names: name_with_space = re.sub(r"(\w)([A-Z])", r"\1 \2", name) empty_display_names.append(name_with_space) user_skill = Skill.objects.filter(user=the_user) # user.is_authenticated = True data_dict = {'profile_config': profile_config, 'unit_names': empty_display_names, 'the_user': the_user, 'user': request.user, 'can_edit': False, 'view_name': 'Profile', 'user_skill':user_skill, } return render_to_response('myprofile/edit_profile.html', data_dict, RequestContext(request))
for field in model._meta.fields: field_type = field.get_internal_type() if (field_type != 'OneToOneField' and not any(s in field.attname for s in ['password', 'timezone', 'deactivate_type'])): field_name = "%s_%s" % (model.__name__, field.attname) solr_dict[field_name] = getattr(obj, field.attname) return solr_dict post_save.connect(prepare_add_to_solr, sender=User, dispatch_uid="user") post_delete.connect(prepare_delete_from_solr, sender=User, dispatch_uid='user') pre_save.connect(presave_solr, sender=User) post_save.connect(prepare_add_to_solr, sender=SavedSearch, dispatch_uid='savedsearch') post_delete.connect(prepare_delete_from_solr, sender=SavedSearch, dispatch_uid='savedsearch') pre_save.connect(presave_solr, sender=SavedSearch) for model_class in ProfileUnits.__subclasses__(): pre_save.connect(presave_solr, sender=model_class) post_save.connect(prepare_add_to_solr, sender=model_class, dispatch_uid="att_post_save_"+model_class.__name__) post_delete.connect(prepare_delete_from_solr, sender=model_class, dispatch_uid="att_post_save_"+model_class.__name__)
def export_hr(request, candidates, export_type, models_excluded=[]): """ Generates HR-XML or HR-JSON, depending on export_type. """ time = datetime.now().strftime('%m%d%Y') company_id = request.REQUEST.get('company') try: company = Company.objects.get(id=company_id) except Company.DoesNotExist: raise Http404 models = [model for model in ProfileUnits.__subclasses__() if model._meta.module_name not in models_excluded] model_names = [model._meta.module_name for model in models] users_units = ProfileUnits.objects.filter( user__in=candidates).select_related('user', 'user__id', 'profileunits', 'content_type__name', *model_names) # initial dict for grouped units gu = {} for k1, v1 in groupby(users_units, lambda x: x.user): pus = [] for k2, v2 in groupby(v1, lambda x: x.content_type.name): pus.append((k2, list(v2))) pus = OrderedDict(pus) gu[k1] = pus if export_type == 'xml': root = etree.Element("candidates") for user, units in gu.items(): new_candidate = etree.SubElement(root, "candidate") etree.SubElement(new_candidate, "email").text = user.email for unit in units.values(): fields = [] if len(unit) > 1: name = unit[0].get_verbose().replace(" ", "") if str(name).endswith('y'): name = name[:-1] + "ies" elif str(name).endswith('s'): name += 'es' else: name += 's' xunit = etree.SubElement(new_candidate, name) for u in unit: instance = getattr( u, u.content_type.name.replace(" ", "")) if not fields: fields = retrieve_fields(instance) more_units = etree.SubElement( xunit, u.get_verbose().replace(" ", "")) for field in fields: value = unicode(getattr(instance, field)) etree.SubElement(more_units, field).text = value else: xunit = etree.SubElement( new_candidate, unit[0].get_verbose().replace(" ", "")) instance = getattr( unit[0], unit[0].content_type.name.replace(" ", "")) fields = retrieve_fields(instance) for field in fields: value = unicode(getattr(instance, field)) etree.SubElement(xunit, field).text = value response = HttpResponse(etree.tostring(root, pretty_print=True), content_type='application/force-download') response['Content-Disposition'] = 'attachment; filename=' + \ company.name + "_DE_"+time+'.xml' return response elif export_type == 'json': full_json = {} user_info = {} for user, units in gu.items(): units_info = {} for unit in units.values(): fields = [] if len(unit) > 1: name = unit[0].get_verbose().replace(" ", "") if str(name).endswith('y'): name = name[:-1] + "ies" else: name += "s" model_info = {} n = 0 for model in unit: model_name = model.get_verbose().replace(" ", "") instance = getattr( model, model.content_type.name.replace(" ", "")) if not fields: fields = retrieve_fields(instance) field_info = {} for field in fields: value = unicode(getattr(instance, field)) field_info[field] = value n += 1 model_info[model_name+str(n)] = field_info units_info[name] = model_info else: name = unit[0].get_verbose().replace(" ", "") instance = getattr( unit[0], unit[0].content_type.name.replace(" ", "")) fields = retrieve_fields(instance) field_info = {} for field in fields: value = unicode(getattr(instance, field)) field_info[field] = value units_info[name] = field_info user_info[user.email] = units_info full_json['candidates'] = user_info response = HttpResponse(json.dumps(full_json, indent=4), content_type='application/force-download') response['Content-Disposition'] = 'attachment; filename=' + \ company.name + "_DE_"+time+'.json' return response
def export_csv(request, candidates, models_excluded=[], fields_excluded=[]): """ Exports comma-separated values file. Function is seperated into two parts: creation of the header, creating user data. Header creation uses a tuple and a Counter to determine the max amount of each module type (education, employmenthistory, etc). Then the header is created in the format of [model]_[field_name]_[count] excluding models and or fields in either lists (models_excluded and fields_excluded). The header is always the first line in the csv. User data creation iterates through the list of profileunits. The profileunits are ordered_by user so when the user changes it prints the past user's row and makes a new row for the current user. Inputs: :candidates: A set list of Users :models_excluded: List of strings that represents profileunits content_type model names :fields_excluded: List of strings that would target specific fields Outputs: :response: Sends a .csv file to the user. """ response = HttpResponse(content_type='text/csv') time = datetime.now().strftime('%m%d%Y') company_id = request.REQUEST.get('company') try: company = Company.objects.get(id=company_id) except Company.DoesNotExist: raise Http404 response['Content-Disposition'] = ('attachment; filename=' + company.name+"_DE_"+time+'.csv') writer = csv.writer(response) models = [model for model in ProfileUnits.__subclasses__() if model._meta.module_name not in models_excluded] model_names = [model._meta.module_name for model in models] users_units = ProfileUnits.objects.filter( user__in=candidates).select_related('user', 'user__id', 'profileunits', 'content_type__name', *model_names).order_by('user') # Creating header for CSV headers = ["primary_email"] tup = [(x.user.id, x.content_type.name) for x in users_units] tup_counter = Counter(tup) final_count = {} tup_most_common = tup_counter.most_common() for model_name in model_names: for counted_model in tup_most_common: if (counted_model[0][1].replace(" ", "") == unicode(model_name) and counted_model[0][1].replace(" ", "") not in final_count): final_count[model_name] = counted_model[1] for model in models: module_count = 0 current_count = 1 if model._meta.module_name in final_count: module_count = final_count[model._meta.module_name] while current_count <= module_count: models_with_fields = [] fields = retrieve_fields(model) for field in fields: if field not in fields_excluded: ufield = model._meta.module_name + "_" + field + "_" + str( current_count) else: continue if ufield: models_with_fields.append(ufield) headers.extend(models_with_fields) current_count += 1 writer.writerow(headers) # Making user info rows user_fields = [] temp_user = None for unit in users_units: user = unit.user num = 0 if user == temp_user: continued = True else: continued = False temp_user = user del_user_num = candidates.index(temp_user) del(candidates[del_user_num]) if not continued: if user_fields: writer.writerow(user_fields) user_fields = [user.email] # Filling in user_fields with default data while num > len(headers)-1: if not len(user_fields) == len(headers): user_fields.append('""') num += 1 else: break instance = getattr(unit, unit.content_type.name.replace(" ", "")) fields = retrieve_fields(instance) for field in fields: value = getattr(instance, field, u'') value = unicode(value).encode('utf8') # Find where to put value in user_fields n = 1 position = headers.index( unit.content_type.name.replace(" ", "") + "_" + field + "_" + str(n)) while not user_fields[position] == '""': n += 1 position = headers.index( unit.content_type.name.replace(" ", "") + "_" + field + "_" + str(n)) user_fields[position] = '"%s"' % value.replace('\r\n', '') if unit is list(users_units)[-1]: writer.writerow(user_fields) # Everyone that didn't get included from the above code, doesn't have # profileunits. Fill in user_fields with default value. for user in candidates: user_fields = [user.email] for header in headers[1:]: user_fields.append('""') writer.writerow(user_fields) return response
def handle_form(request): """ Handles the user submitting changes to their user profile. The form expects a 'module' GET parameter and an optional 'item_id'. It then uses these to update the existing item or create a new instance """ item_id = request.REQUEST.get('id', 'new') module = request.REQUEST.get('module') module = module.replace(" ", "") item = None if item_id != 'new': try: item = request.user.profileunits_set.get(pk=item_id) item = getattr(item, module.lower()) except ProfileUnits.DoesNotExist: # User is trying to access a nonexistent PU # or a PU that belongs to someone else raise Http404 item_class = item.__class__ try: form = getattr(forms, module + 'Form') except KeyError: # Someone must have manipulated request data? raise Http404 data_dict = { 'view_name': 'My Profile', 'item_id': item_id, 'module': module } if request.method == 'POST': if request.POST.get('action') == 'updateEmail': activation = ActivationProfile.objects.get_or_create( user=request.user, email=item.email)[0] activation.send_activation_email(primary=False) return HttpResponse('success') if item_id == 'new': form_instance = form(user=request.user, data=request.POST, auto_id=False) else: form_instance = form(user=request.user, instance=item, auto_id=False, data=request.POST) model = form_instance._meta.model data_dict['form'] = form_instance data_dict['verbose'] = model._meta.verbose_name.title() model_name = model._meta.verbose_name.lower() if form_instance.is_valid(): instance = form_instance.save() if request.is_ajax(): request.user.update_profile_completion() suggestions = ProfileUnits.suggestions(request.user) return render_to_response( 'myprofile/suggestions.html', { 'suggestions': suggestions[:3], 'model_name': model_name, 'module': { 'item': instance } }, RequestContext(request)) else: return HttpResponseRedirect(reverse('view_profile')) else: if request.is_ajax(): return HttpResponse(json.dumps(form_instance.errors), status=400) else: return render_to_response('myprofile/profile_form.html', data_dict, RequestContext(request)) else: if item_id == 'new': form_instance = form(user=request.user, auto_id=False) if data_dict['module'] == 'Summary': try: summary = request.user.profileunits_set.get( content_type__name='summary') except ProfileUnits.DoesNotExist: summary = None if summary: return HttpResponseRedirect( reverse('handle_form') + '?id=' + str(summary.id) + '&module=' + data_dict['module']) else: form_instance = form(instance=item, auto_id=False) if data_dict['module'] == 'SecondaryEmail': data_dict['verified'] = item.verified model = form_instance._meta.model data_dict['form'] = form_instance data_dict['verbose'] = model._meta.verbose_name.title() return render_to_response('myprofile/profile_form.html', data_dict, RequestContext(request))