Example #1
0
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))
Example #2
0
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))
Example #3
0
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))
Example #4
0
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()
Example #5
0
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))
Example #6
0
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)
Example #8
0
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))
Example #9
0
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
Example #10
0
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
Example #11
0
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))
Example #12
0
    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__)
Example #13
0
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
Example #14
0
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
Example #15
0
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))