diff --git a/app/assets/v2/css/profile.css b/app/assets/v2/css/profile.css index a7265ca9b4e..cc3fa797831 100644 --- a/app/assets/v2/css/profile.css +++ b/app/assets/v2/css/profile.css @@ -2,9 +2,16 @@ min-height: 150px; } -.profile-header > .container { - padding-top: 3.5rem; - color: #fff; +.overflow-visible { + overflow: visible; +} + +.profile-card { + background: white; + border-radius: 5px; + z-index: 1; + position: relative; + padding: 2rem; } .profile-header__avatar { @@ -12,14 +19,14 @@ width: 6.75rem; height: 6.75rem; border-radius: 50%; - border: 0.2rem solid #1AB56D; } .profile-header__handle { - padding-top: 1.5rem; + padding-top: 0.8rem; margin-bottom: 0; - text-transform: uppercase; line-height: 1; + font-weight: 700; + font-size: 1.7rem; } .profile-header__handle small { @@ -39,17 +46,17 @@ padding: 0; } -.profile-header__links a i { +.profile-header__links a { margin-left: 2px; margin-right: 2px; font-size: 1.2rem; transition: all 0.3s; - color: #FFF; + color: #000; + text-decoration: none; } .profile-header__links a:hover i { color: #1AB56D; - transform: scale(1.5) rotate(360deg); } .profile-header__links img { @@ -97,21 +104,31 @@ } } +@media (min-width: 388px) { + .profile-card { + margin-top: -5rem; + } +} + .profile-header__stats { - background-color: transparent; + border: none; } .profile-header__stats .card-header { padding: 0.1rem 0.7rem; - font-weight: bolder; - color: #0D0764; - text-transform: uppercase; + color: #666; border-radius: 0; + border-bottom: none; + font-size: 1.2rem; +} + +.profile-header__stats .card-header b { + color: #000; + font-size: 1.7rem; } .profile-header__stats .card-body { - font-weight: lighter; padding: 0.7rem; } @@ -141,28 +158,55 @@ margin-top: 0; } -.profile-header__stats--contributor { - border: 0.2rem solid #25E899; +.profile-header__stats--contributor .card-header { + background-color: transparent; } -.profile-header__stats--contributor .card-header { - background-color: #25E899; +.card-header::after { + content: ''; + position: relative; + height: 4px; + width: 100%; + display: block; + border-radius: 6px; + animation: grow 1s ease-in-out; } -.profile-header__stats--contributor .highlight { - color: #25E899; +.animate-verify { + animation: verify 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); } -.profile-header__stats--funder { - border: 0.2rem solid #FFCE08; +@keyframes grow { + 0% { + width: 2%; + } + 50% { + width: 2%; + } + 100% { + width: 100%; + } } -.profile-header__stats--funder .card-header { - background-color: #FFCE08; +@keyframes verify { + 0% { + transform: scale(1.5, 1.3); + } + 100% { + transform: scale(1); + } +} + +.profile-header__stats--contributor .card-header::after { + background: #00eb93; } -.profile-header__stats--funder .highlight { - color: #FFCE08; +.profile-header__stats--funder .card-header::after { + background: #FFCE08; +} + +.profile-header__stats--funder .card-header { + background-color: transparent; } .profile-section-title { @@ -238,14 +282,19 @@ .profile_details .works_with_list img { max-width: 30px; border-radius: 50%; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.10); } -.profile-header__stats--contributor .works_with_list img { - border: 0.1rem solid #25E899; -} - -.profile-header__stats--funder .works_with_list img { - border: 0.1rem solid #FFCE08; +.profile_details .works_with_list .plus-img{ + width: 30px; + height: 30px; + display: inline-flex; + background: #F8F9FA; + border-radius: 30px; + align-items: center; + vertical-align: middle; + font-size: 10px; + justify-content: center; } .no-profile-button { @@ -256,4 +305,4 @@ .no-profile-textcolor { color: #666666; -} \ No newline at end of file +} diff --git a/app/assets/v2/images/badge-verify.svg b/app/assets/v2/images/badge-verify.svg new file mode 100644 index 00000000000..8a500cd27a6 --- /dev/null +++ b/app/assets/v2/images/badge-verify.svg @@ -0,0 +1 @@ + diff --git a/app/assets/v2/js/pages/profile.js b/app/assets/v2/js/pages/profile.js index 67194dd6851..65fc0e3c44f 100644 --- a/app/assets/v2/js/pages/profile.js +++ b/app/assets/v2/js/pages/profile.js @@ -1,46 +1,4 @@ $(document).ready(function() { - $('[data-toggle=popover]').popover({ - html: true, - trigger: 'focus', - template: '', - content: function() { - var content = $(this).attr('data-popover-content'); - - return $(content).children('.popover-body').html(); - }, - title: function() { - var title = $(this).attr('data-popover-content'); - - return $(title).children('.popover-heading').html(); - } - }); - - if (!document.hasPreferredPayoutAddress) { - $('[data-toggle=popover]').popover('show'); - } - - $('body').on('submit', '#form-wallets', function(e) { - e.preventDefault(); - - var data = $('#form-wallets').serializeArray(); - - data.push({'page': 2}); - - var postWallets = fetchData( - e.currentTarget.action, - e.currentTarget.method, - data - ); - - $.when(postWallets).then(function(response) { - var walletAddress = response.wallets[0]; - var newAddress = new truncate(walletAddress); - - $('#preferred-address').text(newAddress.elem); - $('#preferred-address').prop('title', walletAddress); - $('#kudos-section').html(response.kudos_html); - }); - }); $('#kudos-section').on('click keypress', '.flip-card', e => { if ($(e.target).is('a')) { diff --git a/app/dashboard/admin.py b/app/dashboard/admin.py index bfc26089bfa..50d367acd7a 100644 --- a/app/dashboard/admin.py +++ b/app/dashboard/admin.py @@ -25,6 +25,7 @@ from .models import ( Activity, BlockedUser, Bounty, BountyFulfillment, BountySyncRequest, CoinRedemption, CoinRedemptionRequest, Interest, LabsResearch, Profile, SearchHistory, Tip, TokenApproval, Tool, ToolVote, UserAction, + UserVerificationModel, ) @@ -174,3 +175,4 @@ def network_link(self, instance): admin.site.register(Tool, ToolAdmin) admin.site.register(ToolVote, ToolVoteAdmin) admin.site.register(LabsResearch) +admin.site.register(UserVerificationModel) diff --git a/app/dashboard/migrations/0015_auto_20190301_1625.py b/app/dashboard/migrations/0015_auto_20190301_1625.py new file mode 100644 index 00000000000..1e9616bf3a2 --- /dev/null +++ b/app/dashboard/migrations/0015_auto_20190301_1625.py @@ -0,0 +1,35 @@ +# Generated by Django 2.1.7 on 2019-03-01 16:25 + +from django.conf import settings +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion +import economy.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('dashboard', '0014_merge_20190221_2246'), + ] + + operations = [ + migrations.CreateModel( + name='UserVerificationModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_on', models.DateTimeField(db_index=True, default=economy.models.get_time)), + ('modified_on', models.DateTimeField(default=economy.models.get_time)), + ('verified', models.BooleanField(default=False, help_text="Select to display the Verified checkmark on the user's profile")), + ('speedy_and_responsive', models.BooleanField(default=False)), + ('great_communication', models.BooleanField(default=False)), + ('bug_free_code', models.BooleanField(default=False)), + ('completed_x_bounties', models.BooleanField(default=False)), + ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 0713a7853e4..05bd088b3e6 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -1699,6 +1699,31 @@ def __str__(self): return self.title +class UserVerificationModel(SuperModel): + """Define the checkboxes for user verification.""" + + user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True, blank=True) + verified = models.BooleanField( + default=False, + help_text='Select to display the Verified checkmark on the user\'s profile', + ) + speedy_and_responsive = models.BooleanField( + default=False, + ) + great_communication = models.BooleanField( + default=False, + ) + bug_free_code = models.BooleanField( + default=False, + ) + completed_x_bounties = models.BooleanField( + default=False, + ) + + def __str__(self): + return f"User: {self.user}; Verified: {self.verified}" + + class ProfileQuerySet(models.QuerySet): """Define the Profile QuerySet to be used as the objects manager.""" @@ -1813,6 +1838,11 @@ def get_sent_kudos(self): return kudos_transfers + @property + def get_my_verified_check(self): + verification = UserVerificationModel.objects.filter(user=self.user).first() + return verification + @property def get_profile_referral_code(self): return base64.urlsafe_b64encode(self.handle.encode()).decode() diff --git a/app/dashboard/templates/profiles/organization.html b/app/dashboard/templates/profiles/organization.html index 85f934a800e..d71aaaaf358 100644 --- a/app/dashboard/templates/profiles/organization.html +++ b/app/dashboard/templates/profiles/organization.html @@ -14,27 +14,27 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . {% endcomment %} -{% load i18n static %} +{% load i18n static avatar_tags %}
- {% trans "Organization" %} + #{{ scoreboard_position_org }} {% trans "Organization" %}
    -
  • {{ count_bounties_on_repo }} {% trans "bounties" %}
  • -
  • {{ sum_eth_on_repos|floatformat:2 }} {% trans "ETH" %}
  • - {% if scoreboard_position_org %} -
  • #{{ scoreboard_position_org }} {% trans "org" %}
  • - {% endif %} +
  • {{ count_bounties_on_repo }} {% trans "bounties" %}
  • +
  • {{ sum_eth_on_repos|floatformat:2 }} {% trans "ETH" %}
  • {% if works_with_org|length != 0 %} - ( ) {% trans "Contributors" %}: - {% for profile, num_times in works_with_org.items %} + {% trans "Contributors" %}: + {% for profile, num_times in works_with_org.items|slice:":5" %} - + {% endfor %} + {% if works_with_org|length > 5 %} +
    +10
    + {% endif %} {% endif %}
diff --git a/app/dashboard/templates/profiles/profile.html b/app/dashboard/templates/profiles/profile.html index f361f02af98..48c761d29e8 100644 --- a/app/dashboard/templates/profiles/profile.html +++ b/app/dashboard/templates/profiles/profile.html @@ -15,26 +15,35 @@ {% include 'shared/tag_manager_2.html' %} -
+
{% include 'shared/top_nav.html' with class='d-md-flex' %} {% include 'shared/nav.html' %} + {% if not hidden and is_staff %} +
+ Staff only + {% trans "Profile Admin" %} +
+ {% endif %} +
+
{% if not hidden %} - {% if is_staff %} -
- Staff only - {% trans "Profile Admin" %} -
- {% endif %} -
+
-
+
-

+

{% if profile.data.name %} {{ profile.data.name }} {% endif %} -

+ {% if verification.verified %} + + {% endif %} +

{{ profile.handle }}

{% if preferred_payout_address %} -
{{ preferred_payout_address }}
+ +
+ + {{ preferred_payout_address }} +
{% else %} -
No preferred address
+
{% endif %} {% if profile.show_job_status %} -
{{ profile.job_status_verbose }}
+
+ {{ profile.job_status_verbose }} + {% if profile.resume %}View Resume{% endif %} +
{% endif %} {% if profile.data.bio %}
@@ -70,61 +92,62 @@ {% if profile.is_org %} {% include 'profiles/organization.html' %} {% else %} -
+
- {% trans "Contributor" %} + #{{ scoreboard_position_contributor }} {% trans "Contributor" %}
-
+
    -
  • {{ count_bounties_completed }} {% trans "bounties completed" %}
  • -
  • {{ sum_eth_collected|floatformat:2 }} {% trans "ETH collected" %}
  • +
  • {{ count_bounties_completed }} {% trans "bounties completed" %}
  • +
  • {{ sum_eth_collected|floatformat:2 }} ETH {% trans "collected" %}
  • {% if no_times_been_removed %} -
  • - {% trans "removed from" %} {{ no_times_been_removed }} {% trans "bounties" %}
  • - {% endif %} - {% if scoreboard_position_contributor %} -
  • #{{ scoreboard_position_contributor }} {% trans "contributor" %}
  • +
  • - {% trans "removed from" %} {{ no_times_been_removed }} {% trans "bounties" %}
  • {% endif %}
  • {% if works_with_collected|length != 0 %} - ( ) Contributes To: + Contributes To: {% if works_with_collected|length > 2 %}
    {% endif %} - {% for profile, num_times in works_with_collected.items %} + {% for profile, num_times in works_with_collected.items|slice:":5" %} {% endfor %} + {% if works_with_collected|length > 5 %} +
    +10
    + {% endif %} {% endif %}
-
+
- {% trans "Funder" %} + #{{ scoreboard_position_funder }} {% trans "Funder" %}
    -
  • {{ funded_bounties_count }} {% trans "bounties funded" %}
  • -
  • {{ sum_eth_funded|floatformat:2 }} {% trans "ETH funded" %}
  • - {% if scoreboard_position_funder %} -
  • #{{ scoreboard_position_funder }} {% trans "funder" %}
  • - {% endif %} +
  • {{ funded_bounties_count }} {% trans "bounties funded" %}
  • +
  • {{ sum_eth_funded|floatformat:2 }} ETH {% trans "funded" %}
  • +
  • {% if works_with_funded|length %} - ( ) {% trans "Funds" %}: + {% trans "Funds" %}: {% if works_with_funded|length > 2 %}
    {% endif %} - {% for profile, num_times in works_with_funded.items %} + {% for profile, num_times in works_with_funded.items|slice:":5" %} {% endfor %} + {% if works_with_funded|length > 5 %} +
    +10
    + {% endif %} {% endif %}
@@ -135,52 +158,16 @@ {% endif %}
- {% endif %} -
- {% if not hidden and not profile.is_org %} -
-
- {% if user.is_authenticated and request.path == '/profile/' %} -
- - -
- - {% endif %} + {% endif%} + {% if not hidden and not profile.is_org %} +
{% include "shared/profile_kudos.html" %}
+ {% endif %}
- {% endif %}
@@ -274,6 +261,9 @@ diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 5fd768fdc1d..c4dcea13c1d 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -1330,6 +1330,7 @@ def profile(request, handle): context['sent_kudos'] = sent_kudos[0:kudos_limit] context['kudos_count'] = owned_kudos.count() context['sent_kudos_count'] = sent_kudos.count() + context['verification'] = profile.get_my_verified_check currently_working_bounties = Bounty.objects.current().filter(interested__profile=profile).filter(interested__status='okay') \ .filter(interested__pending=False).filter(idx_status__in=Bounty.WORK_IN_PROGRESS_STATUSES) diff --git a/app/retail/templates/shared/footer.html b/app/retail/templates/shared/footer.html index be518603d78..ed9e80a61c9 100644 --- a/app/retail/templates/shared/footer.html +++ b/app/retail/templates/shared/footer.html @@ -80,9 +80,9 @@
{% trans "Legal" %}
{% trans "Privacy" %}
-