Skip to content

Commit 483f70c

Browse files
authored
Add remove tribe on townsquare (#7152)
* Add remove tribe on townsquare * fix migration * Add missing filters * Replace object for ManyToMany * remove miration file * add migration file
1 parent 7afbf87 commit 483f70c

6 files changed

Lines changed: 127 additions & 9 deletions

File tree

app/app/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@
145145
dashboard.views.get_suggested_contributors,
146146
name='get_suggested_contributors'
147147
),
148+
url(
149+
r'^api/v0.1/ignore_suggested_tribes/(?P<tribeId>.*)',
150+
townsquare.views.ignored_suggested_tribe,
151+
name='ignore_suggested_tribes'
152+
),
148153
url(
149154
r'^api/v0.1/social_contribution_email',
150155
dashboard.views.social_contribution_email,

app/assets/v2/js/pages/join_tribe.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,65 @@ const tribeLeader = () => {
106106

107107
tribeLeader();
108108

109+
const build_suggested_tribe = (tribe) => {
110+
return `
111+
<li class="nav-item d-flex justify-content-between align-items-center my-1">
112+
<a style="max-width: 70%;" href="/profile/${ tribe.title }" class="d-flex nav-link nav-line pr-0 mr-0">
113+
<img src="${tribe.avatar_url}" class="rounded-circle avatar mr-2" />
114+
<span class="font-caption">
115+
<span class="nav-title pt-0 mb-0">${tribe.title}</span>
116+
<span class="font-smaller-7">(${ tribe.follower_count } followers)</span>
117+
</span>
118+
</a>
119+
<div>
120+
<a class="follow_tribe btn btn-sm btn-gc-blue font-weight-bold font-smaller-7 px-3" href="#" data-jointribe="${ tribe.title }">
121+
Follow
122+
</a>
123+
<button data-ignore-tribe="${ tribe.title }" class="font-smaller-6 px-0 remove-tribe btn btn-link"><i class="fa fa-times"></i></button>
124+
</div>
125+
</li>`;
126+
};
127+
128+
$(document).on('click', '.remove-tribe', function(e) {
129+
const element = e.target;
130+
131+
if (!document.contxt.github_handle) {
132+
e.preventDefault();
133+
_alert('Please login first.', 'error');
134+
return;
135+
}
136+
$(element).attr('disabled', true);
137+
138+
e.preventDefault();
139+
let tribe;
140+
141+
if ($(element).data('ignore-tribe')) {
142+
tribe = $(element).data('ignore-tribe');
143+
} else {
144+
tribe = $(element.parentElement).data('ignore-tribe');
145+
}
146+
147+
148+
const new_suggested_tribes = fetchData(`api/v0.1/ignore_suggested_tribes/${tribe}`, 'PUT');
149+
150+
$.when(new_suggested_tribes).then((response) => {
151+
$('#suggested-tribes ul').fadeOut(300, function() {
152+
$(this).empty();
153+
154+
response.tribes.map((tribe) => {
155+
const new_suggested_tribe = build_suggested_tribe(tribe);
156+
157+
$('#suggested-tribes ul').append(new_suggested_tribe);
158+
});
159+
160+
});
161+
162+
163+
});
164+
165+
});
166+
167+
109168
const newManageTribe = () => {
110169
$('[data-tribe]').each(function(index, elem) {
111170
$(elem).on('mouseenter focus', function(e) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 2.2.4 on 2020-07-30 15:18
2+
3+
import datetime
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('dashboard', '0134_auto_20200728_1114'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='profile',
16+
name='ignore_tribes',
17+
field=models.ManyToManyField(related_name='ignore', to='dashboard.Profile'),
18+
),
19+
migrations.AlterField(
20+
model_name='tribessubscription',
21+
name='expires_on',
22+
field=models.DateTimeField(blank=True, default=datetime.datetime(2021, 7, 30, 15, 18, 54, 734516), null=True),
23+
),
24+
]

app/dashboard/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2789,7 +2789,7 @@ class Profile(SuperModel):
27892789
last_validation_request = models.DateTimeField(blank=True, null=True, help_text=_("When the user requested a code for last time "))
27902790
encoded_number = models.CharField(max_length=255, blank=True, help_text=_('Number with the user validate the account'))
27912791
sybil_score = models.IntegerField(default=-1)
2792-
2792+
ignore_tribes = models.ManyToManyField('dashboard.Profile', related_name='ignore')
27932793
objects = ProfileManager()
27942794
objects_full = ProfileQuerySet.as_manager()
27952795

app/townsquare/templates/townsquare/shared/feednav.html

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,23 +80,26 @@
8080
Suggested Tribes
8181
</div>
8282
<div id="suggested-tribes" class="panel-active">
83-
<ul class="nav d-inline-block font-body col-sm-9 col-lg-8 pr-2" style="padding-right: 0">
83+
<ul class="nav d-inline-block font-body col-sm-9 col-lg-9 pr-2" style="padding-right: 0">
8484
{% for tribe in suggested_tribes %}
8585
<li class="nav-item d-flex justify-content-between align-items-center my-1">
86-
<a href="/profile/{{ tribe.title }}" class="d-flex nav-link nav-line pr-0 mr-0">
86+
<a style="max-width: 70%;" href="/profile/{{ tribe.title }}" class="d-flex nav-link nav-line pr-0 mr-0">
8787
<img src="{{tribe.avatar_url}}" class="rounded-circle avatar mr-2" />
8888
<span class="font-caption">
8989
<span class="nav-title pt-0 mb-0">{{tribe.title}}</span>
9090
<span class="font-smaller-7">({{ tribe.follower_count }} followers)</span>
9191
</span>
9292
</a>
93-
<a class="follow_tribe btn btn-sm btn-gc-blue font-weight-bold font-smaller-7 px-3" href="#" data-jointribe="{{ tribe.title }}">
94-
Follow
95-
</a>
93+
<div>
94+
<a class="follow_tribe btn btn-sm btn-gc-blue font-weight-bold font-smaller-7 px-3" href="#" data-jointribe="{{ tribe.title }}">
95+
Follow
96+
</a>
97+
<button data-ignore-tribe="{{ tribe.title }}" class="font-smaller-6 px-0 remove-tribe btn btn-link"><i class="fa fa-times"></i></button>
98+
</div>
9699
</li>
97100
{% endfor %}
98101
</ul>
99102
</div>
100103
</div>
101104
<hr>
102-
</div>
105+
</div>

app/townsquare/views.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import re
22
import time
3+
from random import random, shuffle
34

45
from django.conf import settings
56
from django.contrib import messages
7+
from django.contrib.auth.decorators import login_required
68
from django.http import Http404, JsonResponse
79
from django.shortcuts import get_object_or_404, redirect, render
810
from django.template.response import TemplateResponse
911
from django.utils import timezone
1012

1113
import metadata_parser
14+
from django.views.decorators.csrf import csrf_exempt
15+
from django.views.decorators.http import require_http_methods
16+
1217
from app.services import RedisService
1318
from dashboard.helpers import load_files_in_directory
1419
from dashboard.models import (
@@ -299,11 +304,33 @@ def get_param_metadata(request, tab):
299304
return title, desc, page_seo_text_insert, avatar_url, is_direct_link, admin_link
300305

301306

307+
@login_required
308+
@require_http_methods(['PUT'])
309+
@csrf_exempt
310+
def ignored_suggested_tribe(request, tribeId):
311+
profile = request.user.profile
312+
tribe_profile = get_object_or_404(Profile, handle__iexact=tribeId)
313+
314+
profile.ignore_tribes.add(tribe_profile)
315+
316+
return JsonResponse({
317+
'tribes': get_suggested_tribes(request)
318+
})
319+
320+
302321
def get_suggested_tribes(request):
303322
following_tribes = []
304323
if request.user.is_authenticated:
305-
handles = TribeMember.objects.filter(profile=request.user.profile).distinct('org').values_list('org__handle', flat=True)
306-
tribes = Profile.objects.filter(is_org=True).exclude(handle__in=list(handles)).order_by('-follower_count')[:5]
324+
profile = request.user.profile
325+
ignore = list(profile.ignore_tribes.all().values_list('pk', flat=True))
326+
handles = TribeMember.objects.filter(profile=profile).distinct('org').values_list('org__handle', flat=True)
327+
tribes = Profile.objects.filter(is_org=True).exclude(handle__in=list(handles)).exclude(pk__in=ignore).order_by('-follower_count')
328+
count = tribes.count()
329+
330+
if count > 5:
331+
index_shuffle = list(range(count if count < 60 else 60))
332+
shuffle(index_shuffle)
333+
tribes = [tribes[index] for index in index_shuffle[:5]]
307334

308335
for profile in tribes:
309336
handle = profile.handle

0 commit comments

Comments
 (0)