From a7cf2acad2cb14f4d3b603b9c648843e35fcf573 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 29 Nov 2019 16:58:58 -0400 Subject: [PATCH 001/152] Mattermost Driver added - bounty on create task added to dashboard/tasks.py - chat/tasks.py created - wip tasks wip commit --- app/chat/tasks.py | 48 +++++++++++++++++++++++++++++++++++ app/chat/templates/embed.html | 8 +++--- app/chat/views.py | 9 +++---- app/dashboard/helpers.py | 4 +-- app/dashboard/tasks.py | 35 +++++++++++++++++++++++-- requirements/base.txt | 1 + 6 files changed, 90 insertions(+), 15 deletions(-) create mode 100644 app/chat/tasks.py diff --git a/app/chat/tasks.py b/app/chat/tasks.py new file mode 100644 index 00000000000..bfdaa322b3d --- /dev/null +++ b/app/chat/tasks.py @@ -0,0 +1,48 @@ +from django.conf import settings + +from app.redis_service import RedisService +from celery import app, task +from celery.utils.log import get_task_logger + +from mattermostdriver import Driver + +mm_driver = Driver({ + 'url': settings.CHAT_URL, + 'login_id': settings.CHAT_DRIVER_USER, + 'password': settings.CHAT_DRIVER_PASS, + 'token': settings.CHAT_DRIVER_TOKEN +}) + +mm_driver.login() + +logger = get_task_logger(__name__) + +redis = RedisService().redis + +# Lock timeout of 2 minutes (just in the case that the application hangs to avoid a redis deadlock) +LOCK_TIMEOUT = 60 * 2 + + +@app.shared_task(bind=True, max_retries=3) +def create_channel(self, opts, retry: bool = True) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): + + try: + mm_driver.channels.create_channel(options={ + 'team_id': opts['team_id'], + 'name': opts['channel_name'], + 'display_name': opts['channel_display_name'], + 'type': 'O' + }) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/app/chat/templates/embed.html b/app/chat/templates/embed.html index ec4331f166a..87a1d0f127d 100644 --- a/app/chat/templates/embed.html +++ b/app/chat/templates/embed.html @@ -31,9 +31,8 @@
@@ -49,7 +49,5 @@ {% include 'shared/footer.html' %} {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - - diff --git a/app/chat/views.py b/app/chat/views.py index 1361302c41a..52540d9651d 100644 --- a/app/chat/views.py +++ b/app/chat/views.py @@ -18,7 +18,6 @@ """ - from django.conf import settings from django.template.response import TemplateResponse from django.templatetags.static import static @@ -33,9 +32,9 @@ def embed(request): is_staff = request.user.is_staff if request.user.is_authenticated else False - if not is_staff: - context = dict(active='error', code=404, title="Error {}".format(404)) - return TemplateResponse(request, 'error.html', context, status=404) + # if not is_staff: + # context = dict(active='error', code=404, title="Error {}".format(404)) + # return TemplateResponse(request, 'error.html', context, status=404) context = { 'is_outside': True, @@ -43,8 +42,6 @@ def embed(request): 'title': 'Chat', 'card_title': _('Community Chat'), 'card_desc': _('Come chat with the community'), - 'avatar_url': static('v2/images/helmet.png'), - 'is_chat_user': False, 'chat_url': settings.CHAT_URL } diff --git a/app/dashboard/helpers.py b/app/dashboard/helpers.py index 2a0b04b5fd8..394dc957220 100644 --- a/app/dashboard/helpers.py +++ b/app/dashboard/helpers.py @@ -524,12 +524,12 @@ def create_new_bounty(old_bounties, bounty_payload, bounty_details, bounty_id): latest_old_bounty_dict['coupon_code'] = Coupon.objects.get(pk=latest_old_bounty_dict['coupon_code']) bounty_kwargs.update(latest_old_bounty_dict) - + # bounty_on_create.delay() try: print('new bounty with kwargs:{}'.format(bounty_kwargs)) new_bounty = Bounty.objects.create(**bounty_kwargs) merge_bounty(latest_old_bounty, new_bounty, metadata, bounty_details) - + bounty_on_create.delay(new_bounty) except Exception as e: print(e, 'encountered during new bounty creation for:', url) logger.error(f'{e} encountered during new bounty creation for: {url}') diff --git a/app/dashboard/tasks.py b/app/dashboard/tasks.py index 49000c48bac..98bf2922e1c 100644 --- a/app/dashboard/tasks.py +++ b/app/dashboard/tasks.py @@ -1,7 +1,8 @@ from django.conf import settings from app.redis_service import RedisService -from celery import app +from celery import app, group +# from chat.tasks import create_channel from celery.utils.log import get_task_logger from dashboard.models import Profile from marketing.mails import func_name, send_mail @@ -15,6 +16,33 @@ LOCK_TIMEOUT = 60 * 2 +@app.shared_task(bind=True, max_retries=3) +def bounty_on_create(self, team_id, new_bounty, retry: bool = True) -> None: + # what has to happen that we want to chain data from one another together + + tasks = list() + + tasks.append( + create_channel.si({ + 'team_id': team_id, + 'channel_name': f'bounty-{new_bounty.id}', + 'channel_display_name': f'bounty-{new_bounty.id}' + }) + ) + + # what has to happen that we can issue without a dependency from any subtasks? + + # look up users in your tribe invite them to the newly issued bounty + + tasks.append( + bounty_emails.si([], "", "", "", False) + ) + + res = group(tasks) + + res.ready() + + @app.shared_task(bind=True, max_retries=3) def bounty_emails(self, emails, msg, profile_handle, invite_url=None, kudos_invite=False, retry: bool = True) -> None: """ @@ -46,5 +74,8 @@ def bounty_emails(self, emails, msg, profile_handle, invite_url=None, kudos_invi ) except ConnectionError as exc: - print(exc) + logger.info(str(exc)) + logger.info("Retrying connection") self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/requirements/base.txt b/requirements/base.txt index 167025289c2..744e061256d 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -85,3 +85,4 @@ websocket-client bleach python-magic django-oauth-toolkit +mattermostdriver From e50e066a61a427844305abd2fe0a428ace7400c4 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 3 Dec 2019 15:50:33 -0400 Subject: [PATCH 002/152] Initial Documentation for Gitcoin Mattermost Setup --- docs/RUNNING_CHAT_LOCALLY_DOCKER.md | 67 +++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/RUNNING_CHAT_LOCALLY_DOCKER.md diff --git a/docs/RUNNING_CHAT_LOCALLY_DOCKER.md b/docs/RUNNING_CHAT_LOCALLY_DOCKER.md new file mode 100644 index 00000000000..9b0a292fb34 --- /dev/null +++ b/docs/RUNNING_CHAT_LOCALLY_DOCKER.md @@ -0,0 +1,67 @@ +# Running Locally with Docker (Recommended) + +```shell +git clone https://github.com/gitcoinco/mattermost-server.git +git clone https://github.com/gitcoinco/mattermost-client.git + +``` + + + +## Mattermost Developer Setup + +Follow the instructions at https://developers.mattermost.com/contribute/server/developer-setup/ + + +You want `mattermost-server` and `mattermost-client` in the same parent directory + +Server commands are scripted with a relative path to the client at ../mattermost-client + +## Startup server + +### Running in Detached mode + +Runs the server with its dependencies on docker, conflicts with other services presently +```shell +make run-server +``` + +### Developing with the command line shell + +```shell +make run-cli +``` + +### Debugging + +```shell +make debug-server +``` + + +### Viewing Logs + +Actively follow a container's log: + +```shell +docker-compose logs -f mattermost # Or any other container name +``` + +View all container logs: + +```shell +docker-compose logs +``` + +Navigate to `http://localhost:8065/`. + + +You will need to edit the `config/config.json` file with your local environment variables. Look for config items that are marked `# required`. + +## Gitcoin Integration Setup (recommended) + +If you plan on using the Gitcoin integration, please read this first [Django Oauth Toolkit - Register an application](https://django-oauth-toolkit.readthedocs.io/en/latest/rest-framework/getting_started.html#step-3-register-an-application). + +Create an Application on your local copy of Gitcoin and enable skip authorization. + +Once you have those keys you will have to update the `GitCoinSettings` key in `config/config.json` file with the new application keys created above. From 52de667afbf7a028e3f248ff80ea813ab3f084f2 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 6 Dec 2019 12:02:20 -0400 Subject: [PATCH 003/152] Auto reload the workers in development environments to aid in celery task development --- app/__init__.py | 0 app/app/settings.py | 2 ++ app/taskapp/management/__init__.py | 0 app/taskapp/management/commands/__init__.py | 0 app/taskapp/management/commands/celery.py | 19 +++++++++++++++++++ bin/celery/worker/run.sh | 2 +- 6 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 app/__init__.py create mode 100644 app/taskapp/management/__init__.py create mode 100644 app/taskapp/management/commands/__init__.py create mode 100644 app/taskapp/management/commands/celery.py diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/app/settings.py b/app/app/settings.py index e783a0a5bb1..796ec7e3b46 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -467,6 +467,8 @@ CELERY_TASK_SERIALIZER = 'json' # http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_serializer CELERY_RESULT_SERIALIZER = 'json' +# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_backend +CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND', default=CACHEOPS_REDIS) DJANGO_REDIS_IGNORE_EXCEPTIONS = env.bool('REDIS_IGNORE_EXCEPTIONS', default=True) DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS = env.bool('REDIS_LOG_IGNORED_EXCEPTIONS', default=True) diff --git a/app/taskapp/management/__init__.py b/app/taskapp/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/taskapp/management/commands/__init__.py b/app/taskapp/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/taskapp/management/commands/celery.py b/app/taskapp/management/commands/celery.py new file mode 100644 index 00000000000..ab13bf4c98b --- /dev/null +++ b/app/taskapp/management/commands/celery.py @@ -0,0 +1,19 @@ +import shlex +import subprocess + +from django.core.management.base import BaseCommand +from django.utils import autoreload + + +def restart_celery(): + kill_worker_cmd = 'pkill -9 celery' + subprocess.call(shlex.split(kill_worker_cmd)) + start_worker_cmd = 'celery -A taskapp worker -l INFO' + subprocess.call(shlex.split(start_worker_cmd)) + + +class Command(BaseCommand): + + def handle(self, *args, **options): + self.stdout.write('Starting celery worker with autoreload...') + autoreload.run_with_reloader(restart_celery) diff --git a/bin/celery/worker/run.sh b/bin/celery/worker/run.sh index df2bd3fcbb0..e5604fd5553 100644 --- a/bin/celery/worker/run.sh +++ b/bin/celery/worker/run.sh @@ -2,4 +2,4 @@ set -euo pipefail -celery -A taskapp worker -l INFO +cd /code/app; python3 manage.py celery From c7658d7249638992265e7816c945da4e96b07a2f Mon Sep 17 00:00:00 2001 From: Onuwa Nnachi Isaac Date: Sun, 8 Dec 2019 01:14:47 +0100 Subject: [PATCH 004/152] Add chat page --- app/app/urls.py | 1 + app/assets/v2/css/chat.css | 39 +++++ app/assets/v2/images/chat/android.png | Bin 0 -> 246 bytes app/assets/v2/images/chat/apple.png | Bin 0 -> 224 bytes app/assets/v2/images/chat/chat.png | Bin 0 -> 88556 bytes app/assets/v2/images/chat/desktop.png | Bin 0 -> 2983 bytes app/assets/v2/images/chat/mobile.png | Bin 0 -> 1734 bytes .../images/chat/placeholder_feature_image.png | Bin 0 -> 2271 bytes app/assets/v2/images/chat/web.png | Bin 0 -> 3097 bytes app/assets/v2/images/chat/windows.png | Bin 0 -> 197 bytes app/retail/templates/chat.html | 148 ++++++++++++++++++ app/retail/views.py | 3 + 12 files changed, 191 insertions(+) create mode 100644 app/assets/v2/css/chat.css create mode 100644 app/assets/v2/images/chat/android.png create mode 100644 app/assets/v2/images/chat/apple.png create mode 100644 app/assets/v2/images/chat/chat.png create mode 100644 app/assets/v2/images/chat/desktop.png create mode 100644 app/assets/v2/images/chat/mobile.png create mode 100644 app/assets/v2/images/chat/placeholder_feature_image.png create mode 100644 app/assets/v2/images/chat/web.png create mode 100644 app/assets/v2/images/chat/windows.png create mode 100644 app/retail/templates/chat.html diff --git a/app/app/urls.py b/app/app/urls.py index 0bcb2e887e4..75eb713bb2e 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -351,6 +351,7 @@ re_path(r'^pricing/$', retail.views.pricing, name='pricing'), re_path(r'^subscribe/$', retail.views.subscribe, name='subscribe'), re_path(r'^about/?', retail.views.about, name='about'), + re_path(r'^chat/?', retail.views.chat, name='chat_page'), re_path(r'^mission/?', retail.views.mission, name='mission'), re_path(r'^jobs/?', retail.views.jobs, name='jobs'), re_path(r'^vision/?', retail.views.vision, name='vision'), diff --git a/app/assets/v2/css/chat.css b/app/assets/v2/css/chat.css new file mode 100644 index 00000000000..867d0c5b7df --- /dev/null +++ b/app/assets/v2/css/chat.css @@ -0,0 +1,39 @@ +.banner { + background-color: #0d023b; + background-size: cover; + background-position: 0px 0px; + background-repeat: no-repeat; + position: relative; + color: #fff; + padding-top: 5rem; + padding-bottom: 5rem; +} + +.sub-headline { + line-height: 48px; +} + +.online { + color: #25e899; +} + +.dot { + background-color: #25e899; + display: none; + width: 9px; + height: 9px; + border-radius: 50%; + position: absolute; + top: 0.5em; + right: 0.9em; +} + +@media (max-width: 1024px) { + .chat-img { + display: none; + } +} + +.open-app { + background-color: #0D001A; +} \ No newline at end of file diff --git a/app/assets/v2/images/chat/android.png b/app/assets/v2/images/chat/android.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbad34ce0fc61b9d4e49bec30a9b511fd1eeae5 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRO!3HEZ#7tid5-9M9EM{Qf76xHPhFNnYfP#$0 zLGDfr>(0r%1aer?9eo`c7&i8E|4C#8^1D4<978G?djmRoTMT%-1({2lADivqUANkR zQ&~}sL9Ib_MuU-K;e_r}>WL?dQq;YolwCL;vVTl)%r-ez;n}!MOD1rxG#8umBI6$y zZQK(V?ppQO=ZfGTrT8KdW?uF17ruIr7lyrCxbN%});RO23I8XUpZTtz@$=7$t-sm@ nCHfxDe|4!;aNe9rRfoAgoGI))9adckbQXiBtDnm{r-UW|HBeM9 literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/apple.png b/app/assets/v2/images/chat/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3f8ab777bad12721b718d2dbcf267a18f7bab5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ!3HGLSWEVS1PVMNiy0WWg+Z8+Vb&Z8pde#$ zkh>GZx^prwfgF}}M_)$E)e-c@N{8CRB$B+uf+WtV^1_K@!cCG^lRUR;CPc~q0 zU{cYsIKUWmfYCyue97PBy-!jjt9O?v{_$`Lo8au5p;pkGvGtggh1-XQd8!v))-FsG zil4dcvf-OKSDGYV?aB$%fBBnXvYC44X>qmEUyGKdD6`9Yb6H$5*!-XA(xTlLZ$})= Q1v-Gi)78&qol`;+0G0wtQvd(} literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/chat.png b/app/assets/v2/images/chat/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad17074af87af9dc940c79190dd8ea55b2d1f2a GIT binary patch literal 88556 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

U`xlo?cQ|C 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 dZ12dkfQr5sis7nNujcev6v2Za&+69~19 zl$BXkhB}Z5M1DY=(Q!~c{LDMB!?q&gZ?T6Vl=?Z+=7@J3Fc}hjY6Blvu)XqF&?0)c zZ{}0j!Idb7-3vk?%PmU&KksuN&;PO70y042PAN@*fw6r&heOUcfV?8jokzfro{2{O zDuK^zAf0ZP0RR$7qFoh=AmB#JqAvaCz>S%OxQ+iD(Dz7c-<;B5_IA7T3da+fnaOk} zyVeM^x`)x(98q?V9;=b~xxVT-Y?DkN_&1i6H7vZdIFeP!5-8H#ZPmO3deuXwMT8?j z+oE%}L#o8q3*p^!!Mk6~FdT23KFP~2&!&0Dx|h|99^VRB8sYs^n<8mC#} zMsi{XVj*M{j?|+g+?jt|l(;*qSjmOeY22F-WZ@#bMm%N)5#9!Ycv)I!hW|||{Jz9P z!u%FGET!Ns=i!j&ci8aD#i*O;Hh8$1c`o{J6sl=15JSC#*G8Jf~iw?&GotZo(K*3WiS$rlODr8N4oAJY8sk(4|F3tbE* z-2f-f(JtlO7g>OIf=mc#kUEm&Zu*eiQcQ&V=4!C3Ts)6T{_ZO#R%O!kUxi6qNF_~y zIj7d6Pw@~!aPz!@_qTkWd@dXa)~u&%fiwqsk;$Ng9!15d!>0YonQ~yrEK5ix9X1|_ z0?G;=qz6GEjGc{@Dd9aO1T{Y{O zisNu7H#P6>GB~x}PM=E3F)AR81{>mbZKCA`TW(2-c+{V!X33(51_uV5LEq@1z75cf z=V3E(n_c}K1jsCqKrIoQpwR^H$oPfZT{n8yxgKbmue15VSEu+b6(VZ9mLo_fP38 z*(yJ~ms)I+Mo$?D_u%7}q9iYMW&> zmM3YkwpWrx4{I>DrU*e3RVH=$`JlTz<&0jU#8;q11DeHAj;R-h2!yksNhKBt-8^z& z14?VU&+!gOghH5%0X4YvYMo6(N=zP~A01#=yjUt(6 zhlO2k+eq#%iBThGKOgVo%!2zH*dga_f4xqQBTrcTvS%Tn2KuS(^6BqME2mg;g4OP< zVW2zU?WJjjxyAU{5Yh%|`PWi`!cFE8IV{WZSw>+`9zheh3-CTNshW5D0K zyF9Slg515oyX_D%n@sQWzX-oMFuhe$V;dK7Fy1JXY`S8ZwYP8WquIjF;efOz3xr?+ z(SNjr=w(l!$LXRYClAlfXVcm$x5ut#$sRm-+MHdm{OUK z`zD^4WePM?IJctE;B+4r@{U=K2&%pdZjNKB=+^o&Q|YXwWi758FC9hXMK_-DJqP}` z`=A&5|34HXij9;1hrPFsit20QM-c%*6cnUWQ9v5$4iyjv2?=SCEKi;%3oQ@8sG0n5Si7(}8lMccHcAzxm(u&)P&C1KIAr5^*=zGb!E!-P-PGxS%v;;wY6Hy?X-21S!} z#M=(cAUj&lAmJS`@>hw{Y0Cfow4ciIeWB$>6YX`LqdXHZ*;`n{1wRff`HY6IdF`G? zwGNky9;uur&Uq*RvVGQ9;GJL=?apT!l*+U#3VAsv(xCtSNV^AWy3N8dEL!)tCUZ@P z^czwn+bi$;do?=2`yaHfrp(02-vkk&cQIqT^Von_i+9iQPt^_&jIveR6@(k;&wETo z6Xo$Py+wH{|2>jP1$3XWhG888H{P48zB@_KNr1v~)NkWBZ;zj~A0&grN-$@EIllE$ z;zuP#YWVem(}o|z`GBYA?Q2KtX?~~rqfg5d+f`xw9`ee!TpnTrCa>J-DI6$?%Q17~ zacvD`+7=9n(f9~N! z8}Q2`d-cDFKX>2ycHf8g_Z@)i^3U4s|7+&|ccST|Ge5sf2|`0_BJiQTJgbzojXOsyJy7xxy~L3b~i)!SbCB*gaRX>RNc`xOs(-y9=CQX_X0 z;wVP> z_4_X;XDdb-Uo#`YWtY)j2L0k=`j0xh_2a~;6>qN`^De9bQgoufa$vo29?BEA)6Wv1 z77MQ?z>ad}U1xkL?UOx5_vSl05BNIP)^@4A9-7eDH?qY5kBu%A8@quPp~u6?r@2^D z-cvkuhvfNV&8wNfziLHJ)p+lLr)J2}>5LM;!_qZifw}D1RVePVPx@~fxoe~!0p0^{ zQ^JqGpnjKsNBiGA`JZt4pQ!xb`tnQOU5SMMt(N~&G5)78{ZGsEp}i6ZmmmMrng72S z8j7m6BL$?^6oE(hnTG1PcX1bX{7LG$Yc6dfv?UDzK_E@#Yx&E3nqFnG9d_sXb7 z+mWU30xz5%d4huRui5}TTy>yzc@^Smu?1xPv0498HJN0G2<#VzIhjT8UUq~-DXG#2 z*!zV4aC!LZ0$X2`&Mx^YT~@!HpW%9&DrW=jSD(vkTOY>}(S!rK_vH`8_5SbTw%iYj ziEGrZG+cgj^O>E~qu|SbddoWZWBLLJPqVLxUz+k`iy)xP-<9KzNkcWsu=_58rK!^% zP^PWI!k_CEk%2u;FYiQK4I8WDS^4S}lu)i0ZmQ|d=+tqA)Z=)tf|bCE;S=-enF)9@QLGaa^_C|8AYD zy>FK$9F+u1;JDK4fy$gowBt@qH-r|hZ~|y+!8~0aP4p{Q9apKa=lo@Uy2$f}UUraU z=yySY%OC&etoB{txp; z3)-!o=??--rHsQB(Q+zt99s6P{ktip&Z&HIA6%^&lc{uaWBbp$0>~3bCML42wVYfw zwG_NC|9l7U@&~loNgaM@@}xUC)qG~hLCgv_&{6F^hBG#Eq9%H_LWFm?ecFn(Y6{mC zgHbMxyhUEBe?9<>gCK^Dv-aCNw*3>6J_0t@NAQYPowwyIh)u~tM7>qz#Mu(uzNLA| z)2|O!_UlfLA+`Kv-_ku~;MH&a44o|m1O1d-1zUZu23w}Yo!BfgxLqZxaKl7HGn%fY zqSv*=u0_=0#JLFP*4v28+i;lSm6zb3j(E3WV=sI%n7n3F!!onzS={rU(q2!05Spo` zCq9UQ>9xl1hj}GE|GB{h8~Z_Nyiyx->Gi80W^qzq1B#lR+8|;3b(EzB5oNUhTz7f4 zU4KCPv8f8GBWiWvk1pq6uCb=Ox4LwmifVBT+YebZ3y#2jtJ^4r6tS&^d+kt<^7Rs< zfpP$Hn-w;?ua}n=Y`99K#~~ zyP3Q9Ck8I^&wqrA-ADU|HFr8$yPw_FoY5b4m7g8kplVV7WAoJG!PQga%t%nE!0(5j zSUw2|_<8@(IKqWY80|gT^T$YmO*t;d!269mPhgFpqh+k-G6rF^9gs*+HbmY(XH3+%Oi*$KDx8GKe&mkGADsni z6cb#NFd`bhcVylJB{9EE`PuNiEx*}?Bh9(T*P>QB=CG#<=gGoV5c;3{zKM8V(`fe_ z0vYP?hE`iw&UDy3UPw`I*MX|(wf5Ul`a{ElrnBkS^PWVDm}?Ca99d}mNLp1m^4M@F z&85%23;y<`I4nkVTNlCk*R1)5iGdMG1mD%%;9h2Rq}O)lptWYJ7**0v>yMbTTnrwM zA%F|yc$lL50^4Rq$(n1*7JQ^vouz<%l2HzR(;s!N4^dorW&eCgU?34K)8--9hk-Y~ zi6&cnuo+7|z7J>r^#AG{M~Q*KxlCOHY?@Q?y>>O)2}!s+#q=Vih@PEQ+J@+8U+TGx zboWiiCuYnBsE2dM;A>z7_HC1FZdR`X#Y6&gcE-9ox{StlbE0gX{6h@ZGdH*V2kG_{ z7-#+C=)NCtY!f2C=)NAj|L96z`lo3lE_C0xC-hc_0JR~D_wcy!h_Lpq3bt~*>TB;j>vz+F+()?C4^dQhFP z8`B=dnANon&&0wzs`rha)jBiqh$QSwp~4ok@d)glPo)C&6h@-+3hVR-kF|2U9t2Fk z!nbgb6JM1?S~Rc0#aRC7+tqpEqc?4ipLrVU(*P7bv=nNj=~$jMo5wi#xTQFp1`h2t z`eu@{Vkaztg*4*K;vzH@VR>!T6Ag23ulAFkZZ|5 z(YM+0%q%rzh7BK2T=#t^eHxQez&d!?{onxW?94}$jvz3vvhvlu?dx5aX)VwoT(TE+ z-N)OvEiEW0NJUe#prWGU+%|=1$I?bMFd_Kqs`U;|3sBash0U<`_B0GMjIjP($ zsOD$vs)4M^w+{J{_Z{C-iTM=N<+}841^hzhN_YN;xZgwpcFU)KLK(-|!jPWuTA4x8 z6QXn%dYb{Pn&2>Eso|FYHP_TMwovF^guNiC+2pm%p*$eeKQc43U4284&TNuv%B0;7 zD2YAm3Hq#WY@E%+#MG3Qf`cnHV+hAPsje*&r+C0Q10^2%DI-htBENMe0D;~m)0j){ zG{9$}HAzuX)hwKM81%;R*uw)h&qn{vtUo<7^Xc;PvInB43cCS?p9TFHuIHmKCi$0= zD((b`!xvm+^WtCZma4H5ynoDRcnhA1Chx!4ERdX3ewAVL12mjseoOe>f*(miPY6CW zZskC)XCD-(qvH=0f-Y!slHmHpzg#=2sg~6>vn*X+N9@>DmBE({b&)+cl5MM6`kWbM z{P?Yw?1`1*2PC!MHBJH~;-JgX*hSi-q*_YtyzFCE~sc$mq!&Wnq=9|@zNV1odWexLFkhj zO0=8%q`HJy!j2nJutQVL3;G~)1}hsIq!e*tTAGHetn5h_zEFDFtYhp<7#(w@io}!b z2r$*yx_x-V)FY6b{*PY9C7=6Zgtxeh1L!Huh%3FgX2<>Rfx%#iV#Zw=AtooJSS0q} zQhLJQo0fk1ncwxsGf@vOr}%`MXB!7vPa+%iCzX`ChniCA1h1Q79iCfg2D4&yNDYup=WQOa2%Pi8zPx9H|%EZF5-|j2*{6X=Dy3Ft5|1~l2fQey1 z&qQg4LAgHvR3`|Pr8}kkN=b1_&R0-{Qt@j||HLc?0<;LAIX9#HuHSf4d|7V#Y|)Dg zw1yZj=Zb6q>2pNNxRmOwHT9VpR4RPY&cz`#84FcpDS-yE-`SG>yTLd&puzhf_St9t z*SSod6P|^au7zzje6Fd9#X9)hK;VeAeGUVmQgE4CwGB)2GWh9&te$5?Ea( zUtjdTB!OX+MaihPse(dyE%i<*mU3+*t!Tb_qV`1iGnUQc5R?Q|F(7cB~BY4XbFgPEAsI- z-{L~-HFYl8C_F5PBVmoDxw(?Gbk|3%V|qyggLIRD6pxqugB=WGB0ii28yU&!@9%$%ez5BOb|f8CFa9Z02Te_rmGH6*N} z7|-I<0NokDI1CC7=CPR-)_K=K1gwbU6+DAUnKE8D>=gKFpVB+j`B>*c=|-X# zDjeP0%GgtyhllqvA?43bjr5w$gL7yXjRkjg3)p^2zWabP8~Od+2^Sb=-+;QBVrG>>$sdGFAO0zH}4UP5fmZqkr3r%@!DEA#FXJ`D$S<058qF%7o zq1VFKK>NvieJ21c??jq|<}qG=_TZR`2G8@@BiJB1H=W>D*;Ux zEuZYMPZ7v*zj@G_b%r!OtYY6DI&BJ+dt^yYTyPCjd z8g{8lrt;0V0<%1oD`nh@%dj)#{7yO!euDLfH@-nRI)jU~)#+bL^Y`<>{f`=|9Gx82 zo2NvdeWvv;dgIA3vw8mZNlWHGBm&O$mKMVj-!xwFXpVnfsENiHT}SlPBpkK^TSo?C zAwVu{glQCY#XPi2W}2uc1Myw-d8VB=NQjBug3YnHds;n`k-`e$=x?p958B;Ga5+p4 z%>mZqN*8ciaesm$XEHKt4+N@m&K^oJMgN2c2q^6F4->~3j0p(|LCP}A3!B9Ihw^d? zz5!FX&vbqB3uS#$DF|(K;Nl4PWCeEqBK54@w937M;L5D#h)*EL-&{{E86H*;-3%4K z@>&0SmnBg^EN~LuN-7vC(-F;wJj}|PO7F+V!EGw(5-*-M zhd>e&HgH{Q1c}>ZfreAfdAR$0&a6F1?%cwH>~UH9UGKu7pkFeT^pOsyJ}7adwfC&9 zu0BI>!i+;}-RB?Y(6iQ~A+F+)i9Bf#|()5B9N+&sLS zuUb$Hf7z*>*RM&0jPtp_8s%f)!DQvRfs*u~7bXdO_Q7hEtJDDyWyFE`Y^o>t#q8Q;1HB=7U^JxTsJL&@y4X6Uvnj>8pvvq0-* zJ(N=z2mt6AAdEk}5~~3s9q>B=F>-KixG?7M3~mkh-3}m6wwg6PRMOL%qhVpe#yrRm zfR7Tz_Km7vEaPkoIE>E>#CvBu#$K;wJdFLT-yr}QZURR2m9UCs8qSS`cVB@G4fhYt?-BX!rwiFY zQEzpCRIN0zlcV>#GPZidkrJ#QR;c5^2K@r|x5@Io_3k2Pi51@Q4!GA)+YKzfd-9jX z(ppDL`_UkAg=Ndh=x%}XLIY1PndiAsk2@I=NnUE zD$WA{2NJ&KM&1X!n8;UlIgAb*d4WALt<@C0*MCSF0A?EGP5Z&PVCwqq z;e6+AQNkvQabIU%uKwDZ8Z}^{S`>XV?zi3hM3X+v6!5SeC)S7$le;vRWePYCKjXKa zetukY-PjL7uk0`ZqMHMuJe4q>1Qy5$ahkkfe=r)@~QV^P8rF1i4(gGpkZ z+7!~NmJpEmAcu3gV4&U1ZR9dhg?u=_jjr?zL|8X?Z71M1w`3H(hOxFt_O(#nxg)&U^kg-{N$=xvZ{ft(b1Vb(k1L)-W4``F{P6x1qU9;>O7G7xbvE6!Y8VR)nc}94 zpcXEA{a_vw0~Z$;;NJfJmsBEdBNW%H&>iTLOxu0w`OT>DZ*3Zf*${KlkNctZz3HSD zqN5DAJhTk6k)j)j<1`#JGqUNmeV0B9UK~AP$Di>U(*MzlR8@~Es3=k?-p*}W?RAXv zNKDIc6(Jd%IR$F+mv@hp6(DgMxH4a(pG=q@xmDguZ)OUN^^u9B z+uo*WzGvsY#8i<+`Lkg1l{F!SQ%Q>2Ek!NqSP*Z26RhemIyQC_*dJsA4nOqu&CwW) z_ufeokhU+$DKD$48lhmYqQ-Bc?-82oXxKa{blBu!hVZsVGGb#9?Wf}KBv|e>c5%au zOZe(hjUFL33ki5o}rO`pqr1D!^tT#RfCV!^#jhq zF{|Y_MIA@ic86qXl#Waqw(VM5g$HN2E zVEs5Sv$`kgol`zog_+-ecno4B|-d%d=Lzs;b{^t;cVKTo9~6^^xnjqS5*29pc!uLfS&_q-|H{Y!K! zzG>BV3Pr5L2l(_;S5657{RDyi3n)l#>oH|3#+dAYf|t>e(}#as>@t8&8A07$vD^OP zxU66HmS;Z(yti&HC575%-^SJT*qif9rW`~yDrT*pLJb@~CDiE91bI62TDzD*Xuo|k z(V=WP?xo|0QNmDH>9T%{4X#xq;ysmb2z6KU@{P?LSGv&BIQ7zu_6R^~t7@q}zTmIM z#OtuUv!9F#W<|-P{Z}ZU(5TDHkoYqZ?nJYsHe- z?9DT(j8pnf_Nd&iVgdr^aqqf+{|}oIs6BHJn0yIcfKRw1&Hh*+>DA4EeD!-0n ziFM+u=`j`$c0y#kXUiO}S^|f0XOWrg1k0YQF#W$Bz5GJQ`EE}>vhr>Jf@`Jm_bS)} zv+){{JRJP@fD&n)e0-NLy)_|$9N1$}u1&w};`n)aRfP_(7yX|T%-iZYz^Zi`6N#M# zF9Zu-9E2wJVPF8BN1P^AHMN4WGTYX%Sf_$s3U>F%56>B*p{LId!x4Qe0}ub~NklOz zXNZLCw6Q9&X}QHKI5crE1sbummtRveX4!#@f&SDg`K+xr(8%|5^R>G_GNr={AP^m3 zzvaWu+Z4~|^G*e96MIc7zKRU|?Mb>ta@&{G$frWj_+g1+g-vhS90GxVLojTS)l_@3 z*xux88P5;t>FLDREGsEHxkib>5Yn3Mwz*zuzLng(NlbD#e+u03X#vTvdH-cke*w0t~#ra0Sx=U)L zif2^j9#)l=S?dMK%ae&QzD>@)rSritKb-XNAmAFr5$PEf6LTo0P9>km7%Ak_?GLZ5 zY|8lC4fP?woAzX;$tl#XgH^;l`?JS-3<7mE0@AKIj%Jvsdo0}i=~?>jGD?!G^4~e9EgQL!!mvK zWtOuaY4SVQ#IWk7A+=jH?M+_BZd2&=kNNEGTc7dXPf6cd%k?UYj2F>M{eA}FIOT7r zDxUt;X|^zcCP2VgjqNz}Fs@lk&FGV@F4t@;u>@goLJu zhb;@abKf?ovFNU0qCZXd7Hnv6Y@LDc3=z7)m-+T>6vPT`6-qZO3LU2o3J-i5$2L;5 z#_DqI<_&X(&9^7#@(?1s_GkOYp@P$s1?`GH1x($*Vvz?30fb9)R&mViBD|hz$euz^ z-C5z8@uQ9g&kp4oFO+TXg!zd5`kEs+rAwg9cRcarUXTghb7t+?M+r41b$9CJI0~K2p+e!A?e&YCq1M!`olI~>v9E84z#xr^mV3&r1(!_M{IZ=cYy_LF-5}Xyr(kO{+ zS*70=b9im@b}BouM0dU!xghq^Byq0k;$`U>;>>xvsE0jqGxRQX5YE18RJ2>qX?^94 zAqyykEH)|* z-*M`Nx=1t7cNJyhj*itP6JO8gnCTJ&@ny3^W4zloZXDY&fS3|R|Ov&GX8 zU889H3DaR$3MCJ7=r!A2*zFN4lw0dohdh~j;7Hn;P&Lx$p zM=rqKOK^Mb=sRBNecL?m9}}SAA5%iJqhc3JWRNEFLV_@b${g5Q7)6O{G&m%FxPZrI zEacq#hpk4;hg$@P4Ylj*WRD7DvPQro(7tU*_apk=2J0TYzotnY2fFVLOHUhCo8B04 zA)P*$=FKqNxjC|#PW8^s^_bC~sF%6bh(QAn#BS__u;bL%OH!gGKBlO<^} zjwMv)Zd^ur9myTaurI|7`yDo(>I2s9GeRHCNv+JyhYFs@u79R!*7KZFE4UYhlhMR3n{I=+{y`SGi4HH`VVd z-M9h?ck~pp)V+{4VrtyPuNX;5RdF(!Thoje<0t2}-hNJm2_eo+$MJ0+k zHXeIA#9S4a%q6c`a(1D!Lyohsmq{D^tM#viON^f6?+QwRrE@zU+{1Q}kjN}3dd6j0 zu+&rD*;?6Wo%Sn_`=2M1;sHavGzrwYh#PA4Y|%?slnMK+W{@Xt$OFl-__iv)_EvNB z2MlyWUpPgDDSGT%n3BNKUd}OM%P=I$8g)W}v1!_`XszmRr{nR(>TmAh2Ob@@>hk`F zIQ<=UZI!H`p9G<{Ltla?<5m5?-NfKbw zsH(G#yp97$#&cMqM~QagT;-ho)9u(>EojTq?|(e2+v~J++~g^&IzNz?%~77UA0=8o z`5Yj|v{|G9SvfFcDT!=w>WFSYj#2Da>RIoge~>bN7kR$sESAykTV73j;;!cPK5gDb zB;cExI-5?BCD1*XwsW*aF6>ITjDV2ibFUA!(TkkFXK-9_xvJa`^n#Y+?j1h{8+70P z_#6HFM)M{xd06bl7XE&z*qOg)^SQBnX~~e+Nvp`oj~UB>3EoHV@JU~#kF%;rYUayxHqNT9{l!;dRqb3Q61XU>M->A-odgMs&v*))TGE(U7-}Z z9?7r+`UoUwPn^(r9eu0~Vc=35KQ(kY77xH`vodV=NxfJ|Ei}-DToJea`{@n69HR5` zmZK;4C9eL2hNjWMfM!U%9$HYCD-FbAFcem=ld&gdgY0SN#V;@U=8+>mcuI!<`|=9F z4Au`J_#QPW)F?Gd%|BEGI4AtAl!b~vl(%1A6CwRX{vS&!f)&8JF-({~njy$H(!0er z9JAV-lH&KS!Ndshy@ah}0mqoG$Mk!}6U#89!jov~s?fgi`NvNyuMF>{)XM?;-R!R? zVGf4{VPVW9gr_LBBGe@~)`}SjULr0301kCPb(!JW2+~XUDpJ z4RZ!O;;`j%!TTJ3hGSx|H=o@el6pnjC6a&fwU=+@0(j4vVZDJ5Q8cAqmW8MEw4@uj z*f|iBma+!$g9OHP2hB(smG2{8{qJ-=fKu#9(d0rsB)S3ph5gy_g4WbYt@)Zf6U@QM z;jvzCvh=T{#h>!qRph^?j(82ATqjjmFvr9*7S%d!4fPc4n z>ZKbog|X`e9ec(aG4#r&&f$VLxEbN&ur;=TrXN|${0UQuBN?{Z_4KLazkqtb$HY7E znfRTQoKBM~B{DxW#{m}jF{OxENo#N{@DvtcnPD{*yG@=w7DN3x8s{b03StyvHOEHUY8lBI@QCH7S ztdLiI76pZG9%57t1t>Z%$`g<%6n zCuyJ{cj18+a!zy}h>~WyRB#oQT)XW{Midw&>cU+Voy<8AX7^H>;o3hF>8dOG`~b)2 z0w6av$Id0^hW$OV4hyzhX8J4JF5rNLUB8>Sk_n8!ZX+k#C>z+RfaA#!JKx$&r^&XZ zMdX|fb0p|-G=N=Gt@m8@5jvQqP`8wFjHcHVj8@Z<&Q%5=UiS1d0?Y}}_g(FpD>Idp zpc~y)I=p{bO|2b(^y&&B?N_CL=;A1?($nz9g6Zbkg!%JHZQUObC%_xR`d2c%j1?^+~shH$$5}W4c7s%#|E5s?< zPw7R8|4h^X1#ipE7^-d(oZnNu{}QEREcJvb+`U} z)s^FAX)zb&-@Uq&Bki9R47CceFfa_u$3R=h8s1(cRErqnQV?Ode5$x7hgYZ2yC(TRn;0G$ zPvW~TA>^@A9=IQ0Hf=^_Ba|IGJ6XW)xrsWN2rga!`u(K8d}IW}x4vp-X25jbmYF@$T=lxcIm1E_6td86tqBi%i#mQwQBoln8iu{Cgk zH2KCu%d;s2Be~q#SYfPrUl21laag~0tpeekCqLQGd=ZY!T!xIU^M#(1L1~&12%_aG z^W1ydFaf{|a4ekvwJhvUo%G|es(O}DNk1-RXX1~+Y6C2ylQaC8!a`#9K_m>4rf20Y zN5N+e3rS!qZnjI0VNc36hAS&+vh-AZfXu;VN}b>~(3lz2!OG!`;Fzau@{CA9J_{_@ zYY)=!Zd6${I@Y2J#Lp2gXg||@`t3$T>d ztF2ithViZU!FbJcQKsPE*WO(!r;A6Dg2`$UjA@fWH`$F`h6^4wES{*sQNHAbvu2>X&YUdLOtQ<; zl4be3Wj`kZ7p+ekTh1;^wf=i}?~04xIlIKX)2Mpp1?3X4?Yo9+X)2fr-}CcrKz$h1 z1ozo(i;QHzYT;^&k!nir%gqxI z93G-WkEXfFdUYCC#N^#jwB`sPPLYjEUS;I@-p!DcN^By%=2h~>+J=%e{}vCi)by%h zd0k_5wjxJbhA+BmOteepN9OJz)mKXJP$Q?aNbu3W7onRj`UGCVZ$7AkW+&72=PPZijqS2c0Kud8ygEMn6B~9F!WYIM{GP z&871lx={euW$)O1w)5K5;VhS~M8_VdVaVKcc`kyIN?P5qGYX$q=$MoKFX(a{i|DoM zTdJOZWhO{^9zG}^yq0b{lSZ^wqTEH2u&?SG)~RPHPgxo566?x4#ve%C#5G&}C-G1& zidjWD%fwpU6p-bW4Eq!D4Y)2bu1Vag;8c*EELeP84FA}j>U2-x;r>a@%yOeBLN^G;#AwzYwZ_hc4eQE|) zL+RL9*_3JZd!R>rIMgCTC0@r9dxC%`y;he(VSOVkFG%?~vIt0p_;Vac$;dG{WyW=Q zS6{rEN}A1jD|A;$iD}#apaxjdyPA*L1;?DAS~LpzDzaTKlT`M~2?Zx6if3PghFqp8 zEGa`fhypvCBHrwkFK)osM_r!4>`s>+dmN{Fx->lEEY_bK+J;y2JtIgMPw)I}SP2gO zudoIVImWxN+jdn<>~D;r)l^EQ61Gnr(?5yIf$^%>2AY4eik$j1I`l!GGqEy3U1YL{ znHaIZ*H|OUVbp7JhvLZR$P0A%o{xB|&MDI^EN-|X|10j_zENM4xg-^ycU{+-9;kR;1h_-5$-vG3YPWm9)>%6=~ z%dH;XFmIt#X%uM%wlYp=6K~ae0uoCnxf9iN_sb${wCv`Ab>n`II^TNeHll!wayJE; zOEu$Cp^mJFS#`3k2H!rmfBYxKTeASTsy(F;q*u{1PbO=BKBi2TFf1imH>++SH>{*A z1?>1)ccwwEhgdf!e5O*ZheU@y)yBQuosjqzC>L1Gzns8dwT#q=+!&!+-=>MBloePf8K?Ava1+=h0z%}s7r*BR6lboX?!vhb?`ar6GYWC-e@l0+A#B{Zul9KYc; zqdgU3ri`#JwQ)5C)%@(iQlk0WvyTO|`aQ(KSVb{3^dVQ_g04JoC1V4UA&S`7uE#vSr1& zMLPE2Yjp$N25WTSDUi3Y_U`9DOXbzew&q<1cMj`&Or$lVP47!&K1um0wOg_kl3&i4 zwwg<1=@qFLW(+*c{7egBHVpSj(9kNrVbds4tJ5gi;g6XBS`pTrsCXsje)yb9&`nze zGIXxg9)rqG=PPLpm*xgg+(FMYMH$3iIe^L7|I$@M$bmpcEZKI0tZUpI6+M)$wQ%;v zGtJ<39BXD=3lHl^&8IbP9x;NA;E`oEJt1hpWoY@VRy%i8j<_JFJ%swu{6W^RdGglH zO~C!IL57UGkq}-$H@yg8v>3|DO1aa@wuf8sdzNq8J0SXCX2R$zBuU%6T11<~C!kl29Y^ocC# z3f=x?4C*r#EB9dPts)4oc&_zXd_}XV%OAXdD>{O9Nn;*W2vI0A)2w6v~hE@ zUVU!tLv5}3KsxaOkXfO(Clm(W@_TC;Y^J23Z5$}aOd3}nw%-0vo0sR-IF2_*EFl;I zFc_;`A=~_$!Ky||Ku1@vem<#1Ig+2IkbkY%=Q$>3!`WnXgT;5r(SbZwbEWi~k`fa& z+e8I9%H{`BhBuK?qYhhjy0cARv>w3i$!bvL+-+YU>2S`tKFFAWya*jYTb!m(r6%J3^kr!SU-b`;q`!v?{5J+B1BHPX+sHeU`AgHcu9pqSW=8?}Eh z^I3+wAQiHokTP-f0q{)nKpG@fjk9lJUVqYpzqsoM=uO~7AiGXQP{iya`+L+_Qiz4Q z`kc$6c!K`)qTl6SEB_weoB;MXSaX#PUr2f8QOX%lrWasR6lQazu|5Ue<85mJl!w_T z1f#oEZ^iB^$qPS{kxp(Np#1lK;EQ)TAQKHV7^K6s-3apshRAmE>jz8y20qQzIBr*T zH1zA}PBpv&Cx$Vm$kfTnz7)(JStk&lf>@hOm(AG}a@>O&SDNMlUNZ{bZAEp3XF70E zg?ij;ZK8AOSGx!O+ZHJafMj9`7lH<`=0A(A8H>;heSR$-TgzA@a7-5h0&Lf0&&4o` z(V>~l_pDtGMcY{~o&1SHJDauv3$K8MRSn?G4bzc=h76Frba>(Jw|Cp)UNSQ^15>NM zDPJGav}OHQdt#UE88{z1O%7!?%kj0xIK>)bdM0B}&bn#5CA}6F7Q;$9 z29%CfHCw5&*cKkl@>398fY)}}d993I`GnVLkL~fg`{+`tztaQ4~@c#lmbdmsQyl;GLZ6El$Dxw&7*3BFh z8)e_04a_yT`CEba)0-`0SfEt}c8GVc48&1APb~^>GO8`@g}LVcO;CLfEo1af-@9K( zBX7eiCL+~z(2uKUpJ;W-UbnEfs;&>mAGx=tqM(;E7IIIwLcgRl<5JC5Q#140Q!0(# znW)dUxRt}5%afB(l4bJRTz(V8c<<%o#0er}re?=b+382)9Mb;GvESI(_fq(jsdR#9 zEDoCw-%h0O1eX?c>GZl`{c9{;jq&PDi!kqUz#ns$OWvmNXVp9#z)HIn=-Y?KqYG?Z z-PZ+E%I?WGupcH(^uI$$w2IY4wtD!x0%$hD4CtnkRw)T_ej2D?SEyj~g~iJU`5o(7 zs#s<_k=)4_@28xlL~1O%)QNWtwrM=t!PCdXrj9?sVk)ty1EtBo zrboY0-XnlS0NBu~vQZe$@5YEP>1z^Y^U!ErrCx7}oq24T!!!(xs^N+y z-`A4OrhKGey07bD8arEi=oUIw0|~XTM(j{078!8pKc+@Zd2!#Tdih##3)f7}Kz!i4 z(oE0;9U_p$x(~Ig^FyK#fr=d3*XoC@GYJQL;g5kRWM{_oOt{8NUf#{auI2(S6deE0 zsEaq3Y_(MD>m!Vi_FAgPMbpbiERM00lR~Un3?+pldU|TvU77c{#q~eI79M9E-N2YMaf%vK5*K#zxhT?)}tC(6G+0 z82RZNxT4)Fu@(rWE#BU-Q$4W~SB2BzxGz4} zRe5@c<~&wy_J6Lds?3SAvi&=m0gG9xewJCE1xWYIi?jU!8x9j)?I|Xf7_N18SCbLC zO!v`9n}LUm+rWNU%LcQurWl$JQKqsLR_>opJ$`NoMa-C5F7nDHB6En|!4kt$2AiKs zS2-BGm)cNKf89utI6@Kpef4vR=GyRkzKIQZbc37n$+pm$F2C(mTh$@AfLrZ^l6qDt zYZ)`snV`ky=m$I2^3R&?OgY&@eijs&35+~m`#60^si^`8#`!P#Z$)T?vUI-lLhgzc zurZXt9eTmVBP38Oy+D(R>;_)`SI!?++`TKw|N6t)L`6fh5jsXy2&g%R`5EKN z57x~#&#MlpU-p3Zl7+tH_L!Vho#|^@=L#OI^owNP#HN00J=_*!IJ;Q!Ku*2?AV05F znR_LVR^PQNPHY(3*JEAnC@46YGG-}6b+&Mj6?PDfR{#^as3q{+W(If&EwaZ&Esc5B|GYy&OtHj z@BM?ZthIENa@a5WNK|xnbJ#@=iT+$=v(Q)qm=zE&FazCVJ4L5U)Yl0--BMlo-d5qN#r%{U#=QfaB z&nglV;|oN|dd6OSn@Xpkgw#`0DEXyjSF==gjkC+9qiRe{|0adbw8ONLd8Ep_lMf%z zp+)39I#xO!_4{BX>R>_W@!3&!)FBPrl4vVXPUPo$gs)o(Qyvj6<%|XP;%0FQTlmqs|BuxskKAP>nkKM}#?(Q17S;E3Yl@S50js604> zrEUv($_3ZkX28uGPC}d>B26#mf~|&KIIcY&u z&{hLdJMD&&cU#F{ZA#P6VtDXN5a<{ACS;PGgk1Sm3~SnSsGTWAjO49lIFx=255?by z+`Vb8@LZhrh1SqcJj`0F!97gDxum9g>xo<}45dQabmX}Ti^mdM&vu4tdd4dh5+8Gy z_UAeu=8n!zWYb*Oy^mqbgH;uD2g8|DWH!V+%XLwS;fKke72Gb!wdnQg_aZW7Kn-t7 z6g*MwD4e>|QVomEg6B1dRE|}Sda?t}@ni6uDiQ*a0JNq|0TDw~SkpaJ5foPv)S)s* z@G6bZV`#4kC|;XHh{tWvEVky-kGmJjN662;7;sVj)3dKa4wcGxzwITG+H249BF`Pb z%KpDbe?kIrZm^An8(AI=v-seW=`NGm-ko#G%FIkP5;8%>-djhMmW<7*M6DlZpl^py z2GOH*xeOYY_gK$LrO{6|6|nY)rmTy#IRL!20r@#wqPh9vVO0ZNSb-d?$7vYX#H8~f z<=`cvyxLjUW%?~QF^unG(e&h4&c?;?L#R;c;d-~L=p$ulDIWk9eXGrTO4AbozAZPs z2R17%E$P77>{MRbtmuNm)bQMT^)QFnnjVV{s4Bfk z@1P((fPf-|BuJ4@J_#sN1QZaE5@`~86Hr8v8X@~C2yz5=(xSxoh;TaRH@jzFI+n49U$Df{s!M9HTq9=-cJ-g#Y@gAT= zwzK(JQ;Tr*OIlx*D$!o+a3IIoo`2(K{AX3--KDW6yAD3&_kb1*Y3uslnspwcafMtQErY zTisneVqP!znv5Q1T`hQRM6nLvQcqaBm}#M!ZL=qn)gDER6M*pB*BFBGhRyk$<4fLB z!!uzlTXy~A*5E{(@)a^)Gf(fE(9Dsm+{F;VJUl4fQu_+D51Kj}&>4`qv#AB^Dj|dv z$7E8CH0?I>2v4?rK>msFF}P@#!i>vB9xy0j@KS01dV2}#ITZc$Zaop4m(&ZXzmQg) zZ)L^%(6FV}{rUXv3<^vh81v1Puf&BqX9sF1;K1E#Y;+|3EZy0VQA}CcvqTfDjJW;K ze6ZVw<8^%ckjxu|^#j72KUpHCM{Hb=pa;avk3a#Y3`T8E!!r2p_kpQ!{d)p?~ z$;w2gB)eJa^3}JMUbWmZH}&}9=dEdf8J!=4FDDR~=+>Nk-8;6l|cbObxNu)(&rT*I4Hc zChDU5pmmz1CzdP`7P_;9f-PfTAW&EJgm@Z@!;LJG7mx3BzKU#p)UFgdF=#H=@{!$3 zb)?yGQdV23*dZql>txZyzpn>K`44RO=%#?FvH}Qk;uN$m5EdWclHt~I;THj-jtu@P zy^1*3(cgMcui@p~hsHn_f=pm%(9d<9sWf^0YNuH=lW(~q{H;Q>2#?OTnd{A6sK=I|EbJE07+&K={A)e0wm}rm8VraUns#f} z(T~u3_A#gt;W+tnkkzg~6g&Q+=&K}j@o+PQt%~mS_t1x`Y?mY{6VSs_sSD_o=1dbH z&$~CKga_3X45{`k0-b~go2dJfz6t{@L1ymSDf=y?ecN*Y5>Iu(tpfZw^nyvSVx*|K zOY5&ABFOx`;tul>{}Z=E1{M3NwAm0ELs+`O7-Z0c+L^ zsy5g2!Umy;WjPKp{VHLteTBZ-#Nrifq|%l`aGm19)Q6}27Zz~dK0LmG-=8;x_Ikes zQXRc(D1f#tAw~vWwG%h1_*kWdW>%z+!)zZX+Z@s|T>zrlwbx5u<(iN8Pt?GdPf~Js<{&;&sZdXtE5t>YGCgZ4oakxz zm-BemK(cxD`y0V3mpvLA-q@3-yD&<7TiXdvT*prxP?jfvfIcy0QxclD?k{yeE0O%$ z&Z+!EKNK_Ss6Xkk-p>7M-v0%!+ZDO=TvJ3-Gw!b@;&%ZMKHQHYP`BS14D zbNz!B)QKi4KX`xFH|s2J7LMryM$yv1R1Ob$ok8du}`4d8~?k$Jvbdbp(wbu zJJa@DBV_CqO={WZ#D845Ok0-hK|{oDYevLhL0rzb*zur1I` zWNtfxnVwJL@w~4cAfcQRWDG->7&%-96(zAs7Ta*6ODC=<{;YDqRf5NoEnSc^4r_nq zwnkd&LpARHE$_WtyNgT7Om%yr#l)euXDQZ}^ie9tXHY;c)V)uKJTL_A8VD@`sso>4 z5&X+Kc|(X2n@1i@ahfx8=n{2jMau9GaXv8TczUsza@q3t=8>*Eys(uC~ONnlSw&Kzp(6XMW z*$Z-FXXZzpq?NZQkcuomN}2#wJZoYd+lj-sz8h|~Q& zj-AM=+Zn*p-4DGmQ0yZ+D$R*{?Z*bN@-V~jc9X=N=>8a0au(Oz0CMVm=wAQ4$E*xq zZX}RJ8c8D}yWL0|9SLy&*hAu7U`m&#wo|nv!`JOa@%w6Na)qLDdDbaRF)L{s*GPw(Qi zdfb`u93OwM|6CTK81G}%qyhj8;Kb_5KVYV^yg(emyW1DMfMK%(nicgTDl(pn$}Q?I zk7F>(=ebYRix%Ne)ymx5=q^B15*A|_^{G497Z13DP`LZr$aA(MWZxK5_pXywV4%S{ z%-WvrQOqsNa~ep%!60rocG8Oj)pU>I{a>o$nMEsZmGASN5mdd|6YHH1%ZL%B`my zxCzO;RtmD>x2ePVcWCqaR;Q&`o$BWYn=jDBynkQ^5LGsXlT=a%n@@WY- zZTaV;j|f7TK!lcvPQ?L0?G9%V^5Nunz%KKj>VF#OUvJ@QF)$=wi@L=(G7uzG*tg0> z56Lq*7RO;Ef?mYwdWBjzsh0`0M-EW%o>WcvE->0q(w?g@+Sk{*bNgHGt)c@H$NO9RyA-*jaKP=VCjZjKvuu zWnI7Et&BXBd2cybXs$%%bU}D1#OCTCN)d^SRjap!uQ*vQp61Iag~ptY{nSH$5lqZi z=190B7k8($Mh^y) zz+rfW%k$BX_G(DuiMfkvE7W75J9WIzPx{Nx=s+l`ROerIou$3LFPP3t*e3E&~An14aH2(OTX8+ z=%sGVJiqjfQ6mrt$eOghkH_<&+pBZPq{JStHnJ5Hcx~bNfGu~ypsQR?w3eQrO4RJ?1#5wj|Xg z+iZZsr8aE+2=yPte83RD`51Wq5&wvYagZm8lFXu|Y|1w;{x1^Y4k`zth#`xkA(1-FB%bj)wXsJ1jB~MdXDZMmI06 z%P}%t=&DT({Bx+u!w!dhpl9e>T_GmTA6K<~d-v~dh2Ch$RvLjN;wvX{!aT4K%nNhg z$htrJobJKomDvjIqkdua)p%YI&!B(Un)jqB0Q(1c^3;~#-SkA5Ekyt-xLwu6KKyoN zz5YgLLwW0w^doG5yJDYj_TY7P{t1k-QrCzGrDEyc&v==>&y!Y*4D{gBC%$Dfw)8EN zBuQZX@)}^<-0f)@Gvm%AUr?=64p*TJbP73vc_g553CP-`hnZ)AS2p#nCEJ>|v2wqT z_Y~R=7`Am_&j`V-@NMZ)l@F@hJ95-+8yT=oB?s0GFap-T=1wZ8t(5bUrXGFlx)Yyx zZxUO`HH%S-E7jFS&$xLAX%TqJmS{S}%8VFrZ(e?>A<**Z_5AouB{NR1%3G*}_1kwQ z7WRcmocx*AM|&0U+r2aWd%sHmb{d_A+xqXh{L#}5JuyK(=4MIrM4o-Ud9!>S-e&^N*;j;|5Q>M2)b!rQ$ug)>h z)nCogYd1~vAg~3lM`ms(CKubkc~W+df+YWJgTDb3!v1Q+mG$36`h@5XiVL`JGT29) zT6tl_gI_t9xnx$*foEW3Wue$`au{4h#}Y)&EE$TAowSgAZmy!ZvC<-VI|2eE3fAYN zjvt4BBM592ioD-o)NNzc()`RY%YSxEha&=YqeE<$zmZXcW7lSzl}IUSx}BU{YQ0!F z_sXvU_wbU-149qr(PW+xa<>uKni^Z}`?^Pj2zpoz!v?EPLwUpkrRK;@n?qI&bLxAA z15tXB{CmGXa3a>18Eq!d1~49OsQ?ypq||U{5z(6Mbxds_wy_kdA3~kU24IT3%Qdy| z7r1P#E|s56ZghbF|BJL7#+xolDcxi?7BCSwwKHmu&!x#f`k)n)hPq8bI*Q7U($RQ_ zw160xz54tg8yDHjAhl@SKyxIh0~m+>hN&Xf$JyTVo(qUI-aGN{FMD;(P=gNTKf`|x z9b#XtF8$(lCg2#YfP?ElkQB(dGXGNkB6DzN|JXgik>U$6w2Vne^f*{C)2_%UmJ@@9 z_qEo>(G32BJ3puc=I%{_{JuZUjzb-rcA2PHe`nZ##1$Np2J;}+T{T0WIy=J-9{ixN zl;mT@;S1rtN>l>?;G+F|b3xdKhH(p*oIQPT&;GIF>VH0bht~g}`Cl3R zUzJAB9ps!Hk#-kthi?Dw(g_{(RQyp?xfhO%R--p|FEa9Nk!}n z;e&AZHqVp~WtO4(Uak~vGJ8LiH^jd=9qoAB3vmuxJGG5zp^0quDKlfTN8DC$RC5ru z#DC+{WoqI6U*VE&3#Te9jc(Yg2-7a+h^$e-E84^zl=@v5!(ZcQ8RN2_zzD!>h}ObC zZ#vMlJwP=DG_bb}V2qLBq1_Yy46CCPPs3t&1f;mC`!~M38PoiM7TqGtGKW9sN!wpn cm)@iv-YS9#*0k1M+iipH4WsKNn$8jb10)y?^#A|> literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/desktop.png b/app/assets/v2/images/chat/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..93d00bae3b26bed251db4d27e9782ec16f574e3a GIT binary patch literal 2983 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 Kz$;-lqy7PA9iwvq literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/windows.png b/app/assets/v2/images/chat/windows.png new file mode 100644 index 0000000000000000000000000000000000000000..080e74cc0e83e742ea76985d5f26a2ab32476210 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{!3Opi<85p>QL70(Y)*K0-AY*Zm zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#C{Gv1kP61$3B9}yf;=q~%^P^<@k(4&3)|Ev z*b`8%?#L2+~C_qjw~Q|F?hQAxvX. +{% endcomment %} +{% load i18n static %} + + + {% include 'shared/head.html' %} + + + + + + + {% include 'shared/tag_manager_2.html' %} +

+ {% include 'shared/top_nav.html' with class='d-md-flex' %} + {% include 'home/nav.html' %} +
+ +
+ {% blocktrans %} +

+ Why Gitcoin Chat +

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

+ {% endblocktrans %} +
+
+

+ +

+

Feature 1

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

+
+
+

+ +

+

Feature 2

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

+
+
+

+ +

+

Feature 3

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

+
+
+
+
+
+ {% blocktrans %} +

+ Join us +

+

+ Available on all platform. Chat anytime, anywhere! +

+ {% endblocktrans %} + +
+
+ + {% include 'shared/footer.html' %} + {% include 'shared/analytics.html' %} + {% include 'shared/footer_scripts.html' %} + + + diff --git a/app/retail/views.py b/app/retail/views.py index 7e6e35701df..746d373aef5 100644 --- a/app/retail/views.py +++ b/app/retail/views.py @@ -832,6 +832,9 @@ def about(request): } return TemplateResponse(request, 'about.html', context) +def chat(request): + """Render chat landing page response.""" + return TemplateResponse(request, 'chat.html') def mission(request): """Render the Mission response.""" From e8cc80543b740b0442cb0173e2b4af316dcb6966 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 13:59:55 -0400 Subject: [PATCH 005/152] WIP commit, mgmt sync users to chat cmd added, chat celery tasks updated --- app/chat/management/__init__.py | 0 app/chat/management/commands/__init__.py | 0 .../management/commands/sync_users_to_chat.py | 81 ++++++++++++ app/chat/tasks.py | 115 +++++++++++++++++- 4 files changed, 190 insertions(+), 6 deletions(-) create mode 100644 app/chat/management/__init__.py create mode 100644 app/chat/management/commands/__init__.py create mode 100644 app/chat/management/commands/sync_users_to_chat.py diff --git a/app/chat/management/__init__.py b/app/chat/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/management/commands/__init__.py b/app/chat/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py new file mode 100644 index 00000000000..f478451c52e --- /dev/null +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -0,0 +1,81 @@ +''' + Copyright (C) 2018 Gitcoin Core + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +''' + +from django.core.management.base import BaseCommand +from dashboard.models import Profile +from chat.tasks import create_user +import logging +from celery import group + +logger = logging.getLogger(__name__) + +from marketing.utils import should_suppress_notification_email + + +class Command(BaseCommand): + help = "create users to Gitcoin chat, creates the user if it doesn't exist" + + def handle(self, *args, **options): + try: + + invite_token = '' + users = Profile.objects.filter(user__is_active=True).prefetch_related('user') + + tasks = [] + + for profile in users: + # if profile.chat_id is None: + print(profile) + tasks.append(create_user.si(options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": "false" if should_suppress_notification_email(profile.user.email, 'chat') else "true", + "push": "mention", + "desktop": "all", + "desktop_sound": "true", + "mention_keys": f'{profile.handle}, @{profile.handle}', + "channel": "true", + "first_name": "false" + }, + }, params={ + "iid": invite_token + })) + print(tasks) + job = group(tasks) + + result = job.apply_async() + + print(result.ready()) + + print(result.successful()) + + print(result.get()) + + except ConnectionError as exec: + print(str(exec)) + self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index bfdaa322b3d..c00ec4c3d25 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,20 +1,17 @@ from django.conf import settings from app.redis_service import RedisService -from celery import app, task +from celery import app, group +from dashboard.models import Profile from celery.utils.log import get_task_logger - from mattermostdriver import Driver mm_driver = Driver({ 'url': settings.CHAT_URL, - 'login_id': settings.CHAT_DRIVER_USER, - 'password': settings.CHAT_DRIVER_PASS, + 'port': 443, 'token': settings.CHAT_DRIVER_TOKEN }) -mm_driver.login() - logger = get_task_logger(__name__) redis = RedisService().redis @@ -32,6 +29,7 @@ def create_channel(self, opts, retry: bool = True) -> None: """ with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): + mm_driver.login() try: mm_driver.channels.create_channel(options={ @@ -46,3 +44,108 @@ def create_channel(self, opts, retry: bool = True) -> None: self.retry(30) except Exception as e: logger.error(str(e)) + + +@app.shared_task(bind=True, max_retries=0) +def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:sync_gitcoin_users_to_chat", timeout=60 * 10): + + try: + mm_driver.login() + + users = Profile.objects.filter(user__is_active=True).prefetch_related('user') + + tasks = [] + + for profile in users: + # if profile.chat_id is None: + print(profile) + tasks.append(create_user.si(options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True + } + }, params={ + "iid": invite_token if invite_token else "" + })) + print(tasks) + job = group(tasks) + + result = job.apply_async() + + print(result.ready()) + + print(result.successful()) + + print(result.get()) + + except ConnectionError as exec: + print(str(exec)) + self.retry(30) + except Exception as e: + logger.error(str(e)) + + +@app.shared_task(bind=True, max_retries=1) +def create_user(self, options, params, retry: bool = True): + with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): + mm_driver.login() + + try: + create_user_response = mm_driver.users.create_user(options=options, params=params) + + return create_user_response + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) + return None + + +@app.shared_task(bind=True, max_retries=3) +def update_user(self, user, update_opts, retry: bool = True) -> None: + """ + :param self: + :param user: + :param update_opts: + :param retry: + :return: None + """ + + if update_opts is None: + return + + with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): + mm_driver.login() + + try: + if user.profile.chat_id is None: + chat_user = mm_driver.users.get_user_by_username(user.profile.handle) + if chat_user is None: + raise ValueError(f'chat_user id is None for {user.profile.handle}') + user.profile.chat_id = chat_user.id + user.profile.save() + + mm_driver.users.update_user(user.chat_id, options=update_opts) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) From 92f51ec4d00a6256c30bace4761b1e615cd0a2ad Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 14:03:52 -0400 Subject: [PATCH 006/152] Settings for 1.2(mattermost driver) --- app/app/settings.py | 5 ++++- app/chat/__init__.py | 1 - app/chat/apps.py | 21 +++++++++++++++++++++ app/dashboard/models.py | 1 + app/dashboard/tasks.py | 2 +- app/retail/emails.py | 6 +++++- 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/app/settings.py b/app/app/settings.py index 796ec7e3b46..5cca2bdf0d0 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -91,6 +91,7 @@ 'health_check.contrib.s3boto3_storage', 'app', 'avatar', + 'chat', 'retail', 'rest_framework', 'marketing', @@ -543,7 +544,9 @@ GITHUB_APP_NAME = env('GITHUB_APP_NAME', default='gitcoin-local') # Chat -CHAT_URL = env('CHAT_DRIVER_USER', default='') # location of where mattermost is hosted +CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted +CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted +CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='aomj4f4kgbyazyy6qd3kx4a7dc') # driver token # Social Auth LOGIN_URL = 'gh_login' diff --git a/app/chat/__init__.py b/app/chat/__init__.py index 5322f097c64..e69de29bb2d 100644 --- a/app/chat/__init__.py +++ b/app/chat/__init__.py @@ -1 +0,0 @@ -default_app_config = 'inbox.apps.NotificationConfig' diff --git a/app/chat/apps.py b/app/chat/apps.py index fbbc2705e9c..8af23f63631 100644 --- a/app/chat/apps.py +++ b/app/chat/apps.py @@ -1,3 +1,24 @@ +# -*- coding: utf-8 -*- +"""Define the Dashboard application configuration. + +Copyright (C) 2018 Gitcoin Core + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +""" +from __future__ import unicode_literals + from django.apps import AppConfig diff --git a/app/dashboard/models.py b/app/dashboard/models.py index a4a423ebe3e..a400f5542b6 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -2314,6 +2314,7 @@ class Profile(SuperModel): last_calc_date = models.DateTimeField(default=get_time) email = models.CharField(max_length=255, blank=True, db_index=True) github_access_token = models.CharField(max_length=255, blank=True, db_index=True) + chat_id = models.CharField(max_length=255, blank=True, db_index=True) pref_lang_code = models.CharField(max_length=2, choices=settings.LANGUAGES, blank=True) slack_repos = ArrayField(models.CharField(max_length=200), blank=True, default=list) slack_token = models.CharField(max_length=255, default='', blank=True) diff --git a/app/dashboard/tasks.py b/app/dashboard/tasks.py index 98bf2922e1c..64369b7b714 100644 --- a/app/dashboard/tasks.py +++ b/app/dashboard/tasks.py @@ -2,7 +2,6 @@ from app.redis_service import RedisService from celery import app, group -# from chat.tasks import create_channel from celery.utils.log import get_task_logger from dashboard.models import Profile from marketing.mails import func_name, send_mail @@ -19,6 +18,7 @@ @app.shared_task(bind=True, max_retries=3) def bounty_on_create(self, team_id, new_bounty, retry: bool = True) -> None: # what has to happen that we want to chain data from one another together + # from chat.tasks import create_channel tasks = list() diff --git a/app/retail/emails.py b/app/retail/emails.py index 57902149a6b..6e6004188db 100644 --- a/app/retail/emails.py +++ b/app/retail/emails.py @@ -64,7 +64,11 @@ ('featured_funded_bounty', _('Featured Funded Bounty Emails'), _('Only when you\'ve paid for a bounty to be featured')) ] -ALL_EMAILS = MARKETING_EMAILS + TRANSACTIONAL_EMAILS +NOTIFICATION_EMAILS = [ + ('chat', _('Chat Emails'), _('Only emails from Gitcoin Chat')) +] + +ALL_EMAILS = MARKETING_EMAILS + TRANSACTIONAL_EMAILS + NOTIFICATION_EMAILS def premailer_transform(html): From 7dcd007690dcea21345cea41cefbb5522a87f7ee Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 14:17:38 -0400 Subject: [PATCH 007/152] remove default token for chat driver --- app/app/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app/settings.py b/app/app/settings.py index 5cca2bdf0d0..283d045c0e0 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -546,7 +546,7 @@ # Chat CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted -CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='aomj4f4kgbyazyy6qd3kx4a7dc') # driver token +CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='') # driver token # Social Auth LOGIN_URL = 'gh_login' From d9fdb5a90cf3c04fd0c4168b649f5f6968f14e7b Mon Sep 17 00:00:00 2001 From: Owocki Date: Fri, 13 Dec 2019 08:30:24 -0700 Subject: [PATCH 008/152] copy and fixes small issues --- app/app/urls.py | 6 +-- app/assets/v2/css/chat.css | 4 ++ app/assets/v2/images/chat/feature_1.png | Bin 0 -> 67784 bytes app/assets/v2/images/chat/feature_2.png | Bin 0 -> 27342 bytes app/assets/v2/images/chat/feature_3.png | Bin 0 -> 39299 bytes .../images/chat/placeholder_feature_image.png | Bin 2271 -> 0 bytes app/retail/templates/chat.html | 35 +++++++++--------- 7 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 app/assets/v2/images/chat/feature_1.png create mode 100644 app/assets/v2/images/chat/feature_2.png create mode 100644 app/assets/v2/images/chat/feature_3.png delete mode 100644 app/assets/v2/images/chat/placeholder_feature_image.png diff --git a/app/app/urls.py b/app/app/urls.py index 75eb713bb2e..7ca4af6e0aa 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -144,8 +144,9 @@ url(r'^api/v0.1/choose_persona/', dashboard.views.choose_persona, name='choose_persona'), # chat - url(r'^chat/', chat.views.embed, name='chat'), - url(r'^chat', chat.views.embed, name='chat2'), + url(r'^chat/web', chat.views.embed, name='web_chat'), + url(r'^chat/web/', chat.views.embed, name='web_chat2'), + re_path(r'^chat/?', retail.views.chat, name='chat'), # Health check endpoint re_path(r'^health/', include('health_check.urls')), re_path(r'^lbcheck/?', healthcheck.views.lbcheck, name='lbcheck'), @@ -351,7 +352,6 @@ re_path(r'^pricing/$', retail.views.pricing, name='pricing'), re_path(r'^subscribe/$', retail.views.subscribe, name='subscribe'), re_path(r'^about/?', retail.views.about, name='about'), - re_path(r'^chat/?', retail.views.chat, name='chat_page'), re_path(r'^mission/?', retail.views.mission, name='mission'), re_path(r'^jobs/?', retail.views.jobs, name='jobs'), re_path(r'^vision/?', retail.views.vision, name='vision'), diff --git a/app/assets/v2/css/chat.css b/app/assets/v2/css/chat.css index 867d0c5b7df..495f6930f94 100644 --- a/app/assets/v2/css/chat.css +++ b/app/assets/v2/css/chat.css @@ -36,4 +36,8 @@ .open-app { background-color: #0D001A; +} + +img.feature{ + border-radius: 80px; } \ No newline at end of file diff --git a/app/assets/v2/images/chat/feature_1.png b/app/assets/v2/images/chat/feature_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f976069fdf60b74330fac136b3aaed92ffb85d6b GIT binary patch literal 67784 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

S$c%*MLvTsulspDT_72OSxeEx3nZK%+tU_ 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 KJzJ<|jr~8@y;idT literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/feature_2.png b/app/assets/v2/images/chat/feature_2.png new file mode 100644 index 0000000000000000000000000000000000000000..205266f29a90e2ce104a80599b2b2ee80b3b7a78 GIT binary patch literal 27342 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 JT*@@ye*hln<`Mt^ literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/feature_3.png b/app/assets/v2/images/chat/feature_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9117e4e6e3b12b11d582766c8cf022c447376b03 GIT binary patch literal 39299 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
  • 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 literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/placeholder_feature_image.png b/app/assets/v2/images/chat/placeholder_feature_image.png deleted file mode 100644 index 0cf92bd066c2682acbc695783e0d501d3a968413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2271 zcmV<52q5=~P) z(_9qCPlFw+e!&$GzgTdbv8=$d0&oTJtN>VnumWKPmKA_2u&$tG#^LRYaRu^xKyW&( zo)d2{4QYDQB+X6o|IO6&RUrBGoOAEZy{S<}==FMw^?Kc2SXgNBL))^frQg4QFUozs zEvmQK6F%5k4TB{BT31 z7h~ZxCeh}EZ=agY<_Q&)!U^L=5*B33bV(v`SfK7;FgSeu`gNZQL?MKcX!7{+<1LOR z>ts&4Neiia4mo9Yr~nu(jEM5|>C zTZEAo(6eXH-g9$t?tf&NVQ~&_Zf^GHHPAU1VN?n_roW@cAbsYRqB2iOS65dpmgO@+ zmMoDk(%E(m{{ye35;gWz##8 z8b-;oM<6#iMeSuVtdP1eki{IbkS0}OAd7jVElp~|Ko)aJQ<_wSQLUj40b^llwpf}Y zN=Ra1q@RU*Z+ircMovN>3`ER2i|sUBRL zKv8gqXyn+@jLa;I3?vd{DIzU(>}F!78b(f0;LQPnBD1@^yd3)&#ui3$pqz_=F8^X9 zMKIT&t8quTW2YpkTOdpEkz=UNdW=OZVbq|OO`t5a2nC^Ip_Ai7kOX;H?C z_}~_SO2WZnds2%jR2b=ZAw-wTB2nhalP6nYuZ0T3d2E|N)maaF@_{gFelF%ggSM=R z9DMSDF!g#J(FM40rg<=2@IV;OUu^<_TwykY#qXFfXJ=<(luZE8eG_}EJQ)*4*6=3) ze5n4oe~$yN;}ixEWXy?sVWc9)xw;^TIN@(C-3t>|5d$Fj-SDTRHv~X9_inhO)zWn0 zuHYX8zyxk@Z=cHuwi{uBO(y_?c#e1}sZ9Vxz;(<&VfX>+7ZAy4G-}J%i!ew@AQJAt zbAw6^1uxJ=3SSEaFVLl4uiF-ScY!WE*4VPV>K6bFY$$+4+kj;#6nJ>`kw&MpjN9P!T^0nqtSN=1GM36)VGGiVWR68gX$oQK3jvqz##xM zxVyXSyOZ%RE-vIsYc>He8E1KU`GwbUhqMGD;ez*6ww8MEg#d_v>lZhuSpEk9M9`Ig zTw$b`Apj!q9C3wF*T(4*0O54K>nHg~t4|4laPHl>7lwQBP6&Vy{BDe0!te6(@&{IP z0Dh!*x7lny_a2X(K*i1LPXxd?W0@y-#$AU1@WEq^V?kt07q84L!8!RJCRbk3vKa)I+UfhyDI(dpITlcCd0&{_hV zX%54l4;ALuuU{P$zm>*WSy}0Xy$~vl6u%s0LJb4uC#vByapog8u@4YsDv3i8{c#h8 zL6oT`5?weQIg?(GoLh}3Q#l-((%T;?45Cc6m=;}xsjD|glp#!Zs{+z8+MD*Ksluoz zvrC}VaCF(%d0&k*LGN#=IpJR2cRFv>UQmb){0{|iIpJfgok6sPkzzqk2!c_1~F3U~TzoDala;|{5*9LO=`W4T5#i7gCLQ#pv6iacVcBo9ta(m%6JpokoD zD%znLn0eXN+uPec!m1BN#8Jm?CT5N>!uk2R&ACvDV4FY@kaA*emQ>`CNEqSj>Z--R z#Ai%^Gat*cR$sn+nJ6nHUI|=&0Sq0OkF;)+$|9t)biAC-hnADMs1{L&QXp|k^20UF z9@jMQ2^fQtWsg!KRbd23V-9J{BBU;i0BQ0k3t5Crgb^T3eq<$!keM(7OS8q&d?YXz zWPC_ktZ5avp+AE%M*3;^k2ofD?q!X`{Vea&XgWuc`4!pZ4^X3`4uPz2_i@&;2y?lF zpL9j@_=QaD#tek?IplqtsJlN7nWv;6Jj%Tz#W02vlA+FL+2>K`1DYdq7e>IKWn#M0 z)jzMO;wKkjJka!xM_y57?02A?QPJiD-`yY(MQ%~WPwv8as6HEsHZ}o24)2%UX0vI; zQgX%!O(vCybx7v$GA} z`5Qdwwr+aQv6?M{% trans "Chat with the community" %}
  • {% blocktrans %} - Meet fellow developers, designers, futurists and more. Collaborate and buidl awesome projects together. + Meet fellow developers, designers, futurists and more. Collaborate and BUIDL awesome projects together. {% endblocktrans %}

    15,273 people online @@ -57,38 +57,38 @@

    {% blocktrans %}

    - Why Gitcoin Chat + Meet the Community

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Gitcoin Chat is where the developers, designers, funders of the Gitcoin community hang out + BUIDL the future.

    {% endblocktrans %}

    - +

    -

    Feature 1

    +

    Connected with Gitcoin

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Automatically import your Gitcion profile to the chat system.

    - +

    -

    Feature 2

    +

    Public Channels

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Meet new people, engage in interesting discussions, and expand your horizons with our community in public channels.

    - +

    -

    Feature 3

    +

    DM with Funders

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Got a bounty or a grant you're working on? The private messgae feature is a great way to keep in touch about your work!

    @@ -96,18 +96,19 @@

    Feature 3

    {% blocktrans %} -

    +

    Join us +

    - Available on all platform. Chat anytime, anywhere! + Available on all platforms. Chat anytime, anywhere!

    {% endblocktrans %}
    From 3bd47b52119c54faf37114dd27fc2bdd32a5f63f Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sun, 15 Dec 2019 16:10:46 -0400 Subject: [PATCH 009/152] adding email supression check into the oauth route --- app/dashboard/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 9f0b7e202ba..4c0ae090c72 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -73,7 +73,7 @@ from marketing.mails import ( new_reserved_issue, share_bounty, start_work_approved, start_work_new_applicant, start_work_rejected, ) -from marketing.models import Keyword +from marketing.models import Keyword, EmailSubscriber from oauth2_provider.decorators import protected_resource from pytz import UTC from ratelimit.decorators import ratelimit @@ -110,13 +110,16 @@ @login_required() def oauth_connect(request, *args, **kwargs): active_user_profile = Profile.objects.filter(user_id=request.user.id).select_related()[0] - + from marketing.utils import should_suppress_notification_email user_profile = { "login": active_user_profile.handle, "email": active_user_profile.user.email, "name": active_user_profile.user.get_full_name(), "handle": active_user_profile.handle, "id": active_user_profile.user.id, + "notifyProps" : { + "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True + } } return JsonResponse(user_profile, status=200, safe=False) From 87bc9b0880518234ff31b28b655c8784d948c0b4 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 21:13:46 -0400 Subject: [PATCH 010/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 6beed21d4d3..4e5f2533388 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -16,7 +16,7 @@ $(document).ready(function() { $('#grant_contract_owner_address').text(), '#cancel_grant', 'Looks like your grant has been created with ' + - $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' + $('#grant_contract_owner_address').text(), + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From ce423d6d604c13f63df1ae1d0f6ccf9036725897 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 22:37:21 -0400 Subject: [PATCH 011/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 4e5f2533388..ca0a2c0abb7 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -15,8 +15,7 @@ $(document).ready(function() { $('#grant-admin').text(), $('#grant_contract_owner_address').text(), '#cancel_grant', - 'Looks like your grant has been created with ' + - $('#grant_contract_owner_address').text(), + '. Switch to take action on your grant.' + 'Looks like your grant has been created with ' + $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From 95b0fc46807b35c526dbca7192a41b87faa88cb4 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 22:51:48 -0400 Subject: [PATCH 012/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index ca0a2c0abb7..3825fe18013 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -1,7 +1,7 @@ const editableFields = [ '#form--input__title', '#form--input__reference-url', - '#contract_owner_address', + '#gran_contract_owner_address', '#grant-members', '#amount_goal' ]; From d29dddd503af9269a8221f2670bff68162a5e477 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 22:52:08 -0400 Subject: [PATCH 013/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 3825fe18013..f6998f48e9d 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -1,7 +1,7 @@ const editableFields = [ '#form--input__title', '#form--input__reference-url', - '#gran_contract_owner_address', + '#grant_contract_owner_address', '#grant-members', '#amount_goal' ]; From 182e4cf9fd152510ff6b0347ba1a4408f385f2f7 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 22:59:10 -0400 Subject: [PATCH 014/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index f6998f48e9d..6d13f0dd3a0 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -1,7 +1,7 @@ const editableFields = [ '#form--input__title', '#form--input__reference-url', - '#grant_contract_owner_address', + '#contract_owner_address', '#grant-members', '#amount_goal' ]; @@ -13,9 +13,9 @@ $(document).ready(function() { setInterval (() => { notifyOwnerAddressMismatch( $('#grant-admin').text(), - $('#grant_contract_owner_address').text(), + $('#contract_owner_address').text(), '#cancel_grant', - 'Looks like your grant has been created with ' + $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' + 'Looks like your grant has been created with ' + $('#contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From 120ed04c2f58c34f57766345383a57cf60b1b863 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 23:11:18 -0400 Subject: [PATCH 015/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 6d13f0dd3a0..74fcfe39b52 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -3,7 +3,7 @@ const editableFields = [ '#form--input__reference-url', '#contract_owner_address', '#grant-members', - '#amount_goal' + '#amount_goal', ]; $(document).ready(function() { From cfb391c404ecb1fd0b23ffe576901faba4060353 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Tue, 17 Dec 2019 23:21:14 -0400 Subject: [PATCH 016/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 74fcfe39b52..6d13f0dd3a0 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -3,7 +3,7 @@ const editableFields = [ '#form--input__reference-url', '#contract_owner_address', '#grant-members', - '#amount_goal', + '#amount_goal' ]; $(document).ready(function() { From a4015e725e6a55004d35d877c68a8754bdd4abaf Mon Sep 17 00:00:00 2001 From: Aditya Anand M C Date: Wed, 18 Dec 2019 22:37:40 +0530 Subject: [PATCH 017/152] text update --- app/assets/v2/css/grants/grant.css | 1 + app/grants/templates/grants/index.html | 2 +- app/retail/templates/shared/top_nav.html | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/v2/css/grants/grant.css b/app/assets/v2/css/grants/grant.css index 0b5d5750da2..e7d0ae9ee78 100644 --- a/app/assets/v2/css/grants/grant.css +++ b/app/assets/v2/css/grants/grant.css @@ -331,6 +331,7 @@ cursor: pointer; } +.grant-partners .nav-link, .grant-partners .nav-link:hover { border: none; } diff --git a/app/grants/templates/grants/index.html b/app/grants/templates/grants/index.html index 2bbc309a2da..ced6fc0ef48 100644 --- a/app/grants/templates/grants/index.html +++ b/app/grants/templates/grants/index.html @@ -138,7 +138,7 @@

    {% trans 'Provide sustainable fun

    {{ type }} GRANTS CLR MATCHING ROUND 4

    -

    Jan 2, 2020 - Feb 2, 2020

    +

    Jan 6, 2020 - Jan 21, 2020

    ${{current_partners_fund|floatformat|intcomma}}

    diff --git a/app/retail/templates/shared/top_nav.html b/app/retail/templates/shared/top_nav.html index 35870e16e85..ef4bfc492f7 100644 --- a/app/retail/templates/shared/top_nav.html +++ b/app/retail/templates/shared/top_nav.html @@ -20,7 +20,7 @@
    - {% blocktrans %}The Global Communities Virtual Hackathon runs December 2nd to December 17th - Check out the Details.{% endblocktrans %} + {% blocktrans %}Take Back The Web Virtual Hackathon runs January 6th to January 20th - Check out the Details.{% endblocktrans %} × From f32b81634bf588721eb4ac791a8ba541cd7026d5 Mon Sep 17 00:00:00 2001 From: Owocki Date: Thu, 19 Dec 2019 15:30:23 -0700 Subject: [PATCH 018/152] user id raw id --- app/dashboard/admin.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/dashboard/admin.py b/app/dashboard/admin.py index 3d2eef3578d..b85c6c18e1c 100644 --- a/app/dashboard/admin.py +++ b/app/dashboard/admin.py @@ -48,6 +48,12 @@ class GeneralAdmin(admin.ModelAdmin): list_display = ['created_on', '__str__'] +class BlockedUserAdmin(admin.ModelAdmin): + ordering = ['-id'] + raw_id_fields = ['user'] + list_display = ['created_on', '__str__'] + + class ProfileViewAdmin(admin.ModelAdmin): ordering = ['-id'] raw_id_fields = ['target', 'viewer'] @@ -405,7 +411,7 @@ class TribeMemberAdmin(admin.ModelAdmin): admin.site.register(SearchHistory, SearchHistoryAdmin) admin.site.register(Activity, ActivityAdmin) admin.site.register(Earning, EarningAdmin) -admin.site.register(BlockedUser, GeneralAdmin) +admin.site.register(BlockedUser, BlockedUserAdmin) admin.site.register(PortfolioItem, PortfolioItemAdmin) admin.site.register(ProfileView, ProfileViewAdmin) admin.site.register(UserAction, UserActionAdmin) From 9c4e272bb15bbb1483b64877781594e6ad918aed Mon Sep 17 00:00:00 2001 From: connoroday Date: Thu, 19 Dec 2019 17:22:15 -0500 Subject: [PATCH 019/152] Update emails.py --- app/retail/emails.py | 49 +++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/app/retail/emails.py b/app/retail/emails.py index 0a077ed64ad..c5efacb010e 100644 --- a/app/retail/emails.py +++ b/app/retail/emails.py @@ -927,8 +927,8 @@ def render_start_work_applicant_expired(interest, bounty): def render_new_bounty_roundup(to_email): from dashboard.models import Bounty from django.conf import settings - subject = "Fund Your Code & Code Your Fund" - new_kudos_pks = [7259, 7260, 7096] + subject = "Gitcoin Grants Round 4 & Sustain Web3" + new_kudos_pks = [866, 813, 909] new_kudos_size_px = 150 if settings.DEBUG and False: # for debugging email styles @@ -946,26 +946,29 @@ def render_new_bounty_roundup(to_email): ''' intro = f'''

    -Hey Gitcoiners, +Happy holidays Gitcoiners,

    - Happy Friday! There are only 4 days left to go in the Global Communities virtual hackathon, but still plenty of prizes up for grabs and opportunities to start work. We’ll be giving out our first “Community Choice” prize this time around (1500 DAI total!), so make sure you register if you want to vote. If you’ve already registered, take another look through the prize explorer to make sure you didn’t miss anything. + Just in time for the new year, we couldn’t be more excited to announce Gitcoin Grants Round 4! With a record $200k CLR matching pool, make your voice heard and help us allocate radical funding to your favorite Ethereum projects.

    - We’ve released two blog posts this hack highlighting Hashing Systems and ConsenSys Labs. Dive in to learn more about the organizations and the bounties they are hosting. Both have ample opportunities to take home a nice chunk of change. + Grants Round 4 will run from January 6th through January 21st, 2020. Any contributions made during this two week period will be used to direct the match. We’ll have two separate CLR pools: a $75k Community Pool for media, community, and marketing projects, along with a $125k Infrastructure Pool for Ethereum projects spanning ETH 2.0, decentralized finance (DeFi), crypto wallets, and UX.

    - Finally, there are four new Gitcoin Quests this week for you to dig your teeth into: UNISWAP, A liquidity provider perspective, A Stellar Intro, Crypto Payment App, and Hashing Systems via Hashgraph. Earn some kudos while learning at the same time! + To learn more about Quadratic Funding, check out Vitalik’s review of Round 3. You can also find more information and browse the projects on the Grants page. Even one dollar can go a long way!

    {kudos_friday}

    What else is new?

    • - CodeFund (Gitcoin’s ethical advertising network) is going through a new re-design on the administration views, advertiser dashboard, and publisher dashboard, as well as implementing a new strategy for ads rendered (which you can think as Codefund's base USP). They're looking to lock in subscriptions for 2020, so reach out if you’re interested in advertising to open source or blockchain developers! CodeFund is also starting a podcast network, so stay tuned for more info on that. + Attending EthDenver 2020? Join us the day prior at Sustain Web3, an event Gitcoin is hosting with OSCoin and Radical on February 13th in Boulder, CO. It will be a celebration of Open-Source Sustainability with a full day of workshops, panels, and talks from leaders in Web3 OSS.
    • - If you’re not familiar with CodeFund, join us on today’s livestream to hear the founder Eric Berry discuss why he started CodeFund, how it got to where it is today, and what his mission is to support OSS going forward. Join at 2pm ET. + Sustain Web3 is free to attend and open to anyone. We’ll be sourcing “pay-what-you-can” donations from attendees, sponsors, and general community sustainers through a Gitcoin CLR Grant. Learn more and sign up to attend or apply to speak here. +
    • +
    • + Finally, we’re also hosting a virtual hackathon in anticipation of the event with select winners announced on stage. Learn more and sign up here.

    @@ -974,22 +977,22 @@ def render_new_bounty_roundup(to_email):

    ''' highlights = [{ - 'who': 'iamonuwa', + 'who': 'tbenr', 'who_link': True, - 'what': 'Removed Civic from the MyBit application', - 'link': 'https://gitcoin.co/issue/MyBitFoundation/MyBit-Go.app/515/3801', + 'what': 'Improved Snackbar Animation Behavior for Status', + 'link': 'https://gitcoin.co/issue/status-im/status-react/9288/3735', 'link_copy': 'View more', }, { - 'who': 'seichris', + 'who': 'zeitgeistf', 'who_link': True, - 'what': 'Re-Designed Mockup For Zero-Knowledge Assets', - 'link': 'https://gitcoin.co/issue/invisible-college/democracy/36/3786', + 'what': 'Built a new Hummingbot exchange connector for Liquid.com', + 'link': 'https://gitcoin.co/issue/CoinAlpha/hummingbot/909/3556', 'link_copy': 'View more', }, { - 'who': 'mul1sh', + 'who': 'vird', 'who_link': True, - 'what': 'Removed Cursor Drifts During Navigation on IOS', - 'link': 'https://gitcoin.co/issue/cybersemics/em/4/3715', + 'what': 'Optimized CUDA code using pinned memory for accessing data', + 'link': 'https://gitcoin.co/issue/cybercongress/cyberrank-benchmark/2/3807', 'link_copy': 'View more', }, ] @@ -1006,14 +1009,14 @@ def render_new_bounty_roundup(to_email): } bounties_spec = [{ - 'url': 'https://github.com/iamdefinitelyahuman/brownie/issues/262', - 'primer': 'Brownie - Rebuild / Expand CLI Test Cases', + 'url': 'https://github.com/NethermindEth/nethermind/issues/32', + 'primer': 'Implement LES Protocol', }, { - 'url': 'https://github.com/3box/3box/issues/839', - 'primer': 'Integrate 3Box And Gitcoin: Backup Gitcoin Profiles To 3Box - 1000 DAI Hackathon Bounty', + 'url': 'https://github.com/MetaMask/metamask-extension/issues/6649', + 'primer': 'Support Multiple Hardware Wallets for Metamask', }, { - 'url': 'https://github.com/ConsenSys/Global-Community-Relay/issues/3', - 'primer': 'UX Best-In-Show - 7 ETH Hackathon Bounty (Any project is valid!)', + 'url': 'https://github.com/ProofSuite/OrFeedSmartContracts/issues/26', + 'primer': 'Smart Contract That Creates A Uniswap Market For Pegged Token Upon Creation', }, ] From 6579d3906edfb28065906fee2d3b1f367effa393 Mon Sep 17 00:00:00 2001 From: Dan Lipert Date: Fri, 20 Dec 2019 21:14:46 +0900 Subject: [PATCH 020/152] add holiday image to newsletter --- app/retail/emails.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/retail/emails.py b/app/retail/emails.py index c5efacb010e..2525fc4b415 100644 --- a/app/retail/emails.py +++ b/app/retail/emails.py @@ -957,7 +957,9 @@ def render_new_bounty_roundup(to_email):

    To learn more about Quadratic Funding, check out Vitalik’s review of Round 3. You can also find more information and browse the projects on the Grants page. Even one dollar can go a long way!

    - +

    + +

    {kudos_friday}

    What else is new?

      From 7fa064d8cf276af6dd5a18a019ce7d7abe637467 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 20 Dec 2019 16:44:23 -0400 Subject: [PATCH 021/152] WIP, adding funder and hunter into the same chat channel on bounty work start, only applys to bounties that are tied to an event --- app/app/settings.py | 6 +- app/app/urls.py | 2 +- app/chat/tasks.py | 49 ++++++++++----- app/{retail => chat}/templates/chat.html | 0 app/chat/utils.py | 0 app/chat/views.py | 23 ++++--- app/dashboard/models.py | 2 +- app/dashboard/views.py | 77 ++++++++++++++++++++++++ app/retail/views.py | 3 - 9 files changed, 129 insertions(+), 33 deletions(-) rename app/{retail => chat}/templates/chat.html (100%) create mode 100644 app/chat/utils.py diff --git a/app/app/settings.py b/app/app/settings.py index 283d045c0e0..158b176c57a 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -544,10 +544,10 @@ GITHUB_APP_NAME = env('GITHUB_APP_NAME', default='gitcoin-local') # Chat -CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted -CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted +CHAT_PORT = env('CHAT_PORT', default=8065) # port of where mattermost is hosted +CHAT_URL = env('CHAT_URL', default='http://localhost:8065') # location of where mattermost is hosted CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='') # driver token - +GITCOIN_CHAT_TEAM_ID = env('GITCOIN_CHAT_TEAM_ID', default='') # Social Auth LOGIN_URL = 'gh_login' LOGOUT_URL = 'logout' diff --git a/app/app/urls.py b/app/app/urls.py index 7ca4af6e0aa..bb61153918f 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -146,7 +146,7 @@ # chat url(r'^chat/web', chat.views.embed, name='web_chat'), url(r'^chat/web/', chat.views.embed, name='web_chat2'), - re_path(r'^chat/?', retail.views.chat, name='chat'), + re_path(r'^chat/?', chat.views.chat, name='chat'), # Health check endpoint re_path(r'^health/', include('health_check.urls')), re_path(r'^lbcheck/?', healthcheck.views.lbcheck, name='lbcheck'), diff --git a/app/chat/tasks.py b/app/chat/tasks.py index c00ec4c3d25..58324d6464a 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,16 +1,9 @@ -from django.conf import settings from app.redis_service import RedisService from celery import app, group from dashboard.models import Profile from celery.utils.log import get_task_logger -from mattermostdriver import Driver - -mm_driver = Driver({ - 'url': settings.CHAT_URL, - 'port': 443, - 'token': settings.CHAT_DRIVER_TOKEN -}) +from chat.utils import get_driver logger = get_task_logger(__name__) @@ -29,10 +22,10 @@ def create_channel(self, opts, retry: bool = True) -> None: """ with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: - mm_driver.channels.create_channel(options={ + new_channel = chat_driver.channels.create_channel(options={ 'team_id': opts['team_id'], 'name': opts['channel_name'], 'display_name': opts['channel_display_name'], @@ -46,6 +39,31 @@ def create_channel(self, opts, retry: bool = True) -> None: logger.error(str(e)) +@app.shared_task(bind=True, max_retries=3) +def add_to_channel(self, opts, retry: bool = True) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:add_to_channel:%s" % opts['bounty'].title, timeout=LOCK_TIMEOUT): + + chat_driver = get_driver() + try: + for x in opts['profile']: + if x.chat_id is None: + chat_driver.channels.add_user(opts.bounty.chat_channel_id, options={ + 'user_id': x.chat_id + }) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) + + @app.shared_task(bind=True, max_retries=0) def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> None: """ @@ -57,7 +75,6 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> with redis.lock("tasks:sync_gitcoin_users_to_chat", timeout=60 * 10): try: - mm_driver.login() users = Profile.objects.filter(user__is_active=True).prefetch_related('user') @@ -103,10 +120,10 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> @app.shared_task(bind=True, max_retries=1) def create_user(self, options, params, retry: bool = True): with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: - create_user_response = mm_driver.users.create_user(options=options, params=params) + create_user_response = chat_driver.users.create_user(options=options, params=params) return create_user_response except ConnectionError as exc: @@ -132,17 +149,17 @@ def update_user(self, user, update_opts, retry: bool = True) -> None: return with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: if user.profile.chat_id is None: - chat_user = mm_driver.users.get_user_by_username(user.profile.handle) + chat_user = chat_driver.users.get_user_by_username(user.profile.handle) if chat_user is None: raise ValueError(f'chat_user id is None for {user.profile.handle}') user.profile.chat_id = chat_user.id user.profile.save() - mm_driver.users.update_user(user.chat_id, options=update_opts) + chat_driver.users.update_user(user.chat_id, options=update_opts) except ConnectionError as exc: logger.info(str(exc)) logger.info("Retrying connection") diff --git a/app/retail/templates/chat.html b/app/chat/templates/chat.html similarity index 100% rename from app/retail/templates/chat.html rename to app/chat/templates/chat.html diff --git a/app/chat/utils.py b/app/chat/utils.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/views.py b/app/chat/views.py index 52540d9651d..ba9ae5a98bf 100644 --- a/app/chat/views.py +++ b/app/chat/views.py @@ -20,21 +20,26 @@ from django.conf import settings from django.template.response import TemplateResponse -from django.templatetags.static import static from django.utils.translation import gettext_lazy as _ -from django.views.decorators.clickjacking import xframe_options_exempt +from chat.utils import get_driver -import requests +def chat(request): + """Render chat landing page response.""" -def embed(request): - """Handle the chat embed view.""" + chat_driver = get_driver() + + chat_stats = chat_driver.teams.get_team_stats(settings.GITCOIN_CHAT_TEAM_ID) - is_staff = request.user.is_staff if request.user.is_authenticated else False + context = { + 'chat_stats': chat_stats + } - # if not is_staff: - # context = dict(active='error', code=404, title="Error {}".format(404)) - # return TemplateResponse(request, 'error.html', context, status=404) + return TemplateResponse(request, 'chat.html', context) + + +def embed(request): + """Handle the chat embed view.""" context = { 'is_outside': True, diff --git a/app/dashboard/models.py b/app/dashboard/models.py index a400f5542b6..fd4d296e234 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -367,7 +367,7 @@ class Bounty(SuperModel): ) # TODO: Remove POST ORGS attached_job_description = models.URLField(blank=True, null=True, db_index=True) event = models.ForeignKey('dashboard.HackathonEvent', related_name='bounties', null=True, on_delete=models.SET_NULL, blank=True) - + chat_channel_id = models.CharField(max_length=255), # Bounty QuerySet Manager objects = BountyQuerySet.as_manager() diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 07213c00ca5..dd1628ad385 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -351,6 +351,83 @@ def new_interest(request, bounty_id): if interest.pending: start_work_new_applicant(interest, bounty) + if bounty.event is not None: + from app.chat.tasks import add_to_channel, create_channel, create_user + from django.utils.text import slugify + try: + if bounty.chat_channel_id is None: + + result = create_channel.apply_async({ + 'team_id': settings.GITCOIN_HACK_CHAT_TEAM_ID, + 'channel_name': bounty.title, + 'channel_display_name': f'bounty-{slugify(bounty.title)[:50]}' + }) + + bounty.chat_channel_id = result.get() + bounty.save() + funder_profile = Profile.objects.filter(handle=bounty.bounty_owner_github_username)[0] + + if funder_profile is not None: + if funder_profile.chat_id is None: + chat_funder_user = create_user.__call__( + options={ + "email": funder_profile.user.email, + "username": funder_profile.handle, + "first_name": funder_profile.user.first_name, + "last_name": funder_profile.user.last_name, + "nickname": "string", + "auth_data": funder_profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(funder_profile.user.email, 'chat') else True + } + }, + params={ + "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" + } + ) + + funder_profile.chat_id = chat_funder_user.id + funder_profile.save() + + if profile.chat_id is None: + chat_funder_user = create_user.__call__( + options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True + } + }, + params={ + "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" + } + ) + + profile.chat_id = chat_funder_user.id + profile.save() + + profiles_to_connect = [ + funder_profile, + profile + ] + + add_to_channel.delay({ + 'bounty': bounty, + 'profiles': profiles_to_connect + }) + + except Exception as e: + print(str(e)) except Interest.MultipleObjectsReturned: bounty_ids = bounty.interested \ .filter(profile_id=profile_id) \ diff --git a/app/retail/views.py b/app/retail/views.py index 746d373aef5..7e6e35701df 100644 --- a/app/retail/views.py +++ b/app/retail/views.py @@ -832,9 +832,6 @@ def about(request): } return TemplateResponse(request, 'about.html', context) -def chat(request): - """Render chat landing page response.""" - return TemplateResponse(request, 'chat.html') def mission(request): """Render the Mission response.""" From 550e7359bfbefef44ac444054728f933c3cd61d7 Mon Sep 17 00:00:00 2001 From: Owocki Date: Fri, 20 Dec 2019 14:07:15 -0700 Subject: [PATCH 022/152] a few profile related cleanups; YOLO style --- .../templates/profiles/header_details.html | 22 ++++++++++++------- app/kudos/views.py | 5 +++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/app/dashboard/templates/profiles/header_details.html b/app/dashboard/templates/profiles/header_details.html index 7ccffb9af93..254f964e848 100644 --- a/app/dashboard/templates/profiles/header_details.html +++ b/app/dashboard/templates/profiles/header_details.html @@ -3,11 +3,14 @@

      {{ profile.name }} {% if is_staff and not profile.is_org %} - + {% endif %} - + + + + {% if verification %} + {% endif %}

      @@ -62,6 +65,8 @@

      {% endif %} +{% if 0 %} +TODO: Re-enable this when we have proper privacy in place a la https://github.com/gitcoinco/web/issues/5654 {% if profile.preferred_payout_address %}
      @@ -79,6 +84,7 @@

      {% endif %}

      {% endif %} +{% endif %} {% if not profile.is_org %}
      {% for i in ratings %} diff --git a/app/kudos/views.py b/app/kudos/views.py index afdea7fc675..ecd60ef7ab1 100644 --- a/app/kudos/views.py +++ b/app/kudos/views.py @@ -602,6 +602,7 @@ def receive(request, key, txid, network): if request.user.is_authenticated: kudos_transfer.recipient_profile = request.user.profile kudos_transfer.save() + record_user_action(kudos_transfer.username, 'new_kudos', kudos_transfer) record_user_action(kudos_transfer.from_username, 'receive_kudos', kudos_transfer) record_kudos_email_activity(kudos_transfer, kudos_transfer.username, 'receive_kudos') record_kudos_activity( @@ -709,6 +710,10 @@ def redeem_bulk_coupon(coupon, profile, address, ip_address, save_addr=False): coupon.current_uses += 1 coupon.save() + # user actions + record_user_action(kudos_transfer.username, 'new_kudos', kudos_transfer) + record_user_action(kudos_transfer.from_username, 'receive_kudos', kudos_transfer) + # send email maybe_market_kudos_to_email(kudos_transfer) From 20f100ae2c7fec151cd20a1cf0e41e12c47497df Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Fri, 20 Dec 2019 18:00:47 -0400 Subject: [PATCH 023/152] [Small Fix] Wording issue on Vision --- app/retail/templates/vision.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/retail/templates/vision.html b/app/retail/templates/vision.html index 465d667331a..0237a2e6a5e 100644 --- a/app/retail/templates/vision.html +++ b/app/retail/templates/vision.html @@ -146,7 +146,7 @@

      {% trans "Blockchain will evolve rapidly over tim
    • {% trans "Developers will pay each other in crypto as much as fiat currenty." %}
    • {% trans "It is as easy for a software developer to find work as it is for an Uber driver to find a ride 10 years ago." %}
    • {% trans "Gitcoin is a $30mm / year GMV marketplace." %}
    • -
    • {% trans "Soveirgn Nations will be issuing digital currencies." %}
    • +
    • {% trans "Sovereign Nations will be issuing digital currencies." %}
    From ea7bf30cca21de409d7793fc7c619a41a7eec8cb Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sat, 21 Dec 2019 16:18:09 -0400 Subject: [PATCH 024/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 6d13f0dd3a0..467252d0c71 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -15,7 +15,8 @@ $(document).ready(function() { $('#grant-admin').text(), $('#contract_owner_address').text(), '#cancel_grant', - 'Looks like your grant has been created with ' + $('#contract_owner_address').text() + '. Switch to take action on your grant.' + 'Looks like your grant has been created with ' + + $('#contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From f12ae4bac592ffe54651504074e3e711e529aa7a Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sat, 21 Dec 2019 21:33:07 -0400 Subject: [PATCH 025/152] set nickname to profile handle when creating a new user --- app/dashboard/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboard/views.py b/app/dashboard/views.py index dd1628ad385..b56c806b2c1 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -399,7 +399,7 @@ def new_interest(request, bounty_id): "username": profile.handle, "first_name": profile.user.first_name, "last_name": profile.user.last_name, - "nickname": "string", + "nickname": profile.handle, "auth_data": profile.user.id, "auth_service": "gitcoin", "locale": "en", From 815ade9382d7b5fd0c7e3954546623ae2f6fe37e Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sat, 21 Dec 2019 21:33:47 -0400 Subject: [PATCH 026/152] when creating users in the sync task, set the nickname to the profile handle --- app/chat/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index 58324d6464a..d93d0610f15 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -88,7 +88,7 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> "username": profile.handle, "first_name": profile.user.first_name, "last_name": profile.user.last_name, - "nickname": "string", + "nickname": profile.handle, "auth_data": profile.user.id, "auth_service": "gitcoin", "locale": "en", From d572a7ee061320fb4c0ccdbceda446049981442e Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sat, 21 Dec 2019 22:46:16 -0400 Subject: [PATCH 027/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 467252d0c71..ba6986a20e9 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -2,6 +2,7 @@ const editableFields = [ '#form--input__title', '#form--input__reference-url', '#contract_owner_address', + '#grant_contract_owner_address', '#grant-members', '#amount_goal' ]; @@ -16,7 +17,7 @@ $(document).ready(function() { $('#contract_owner_address').text(), '#cancel_grant', 'Looks like your grant has been created with ' + - $('#contract_owner_address').text() + '. Switch to take action on your grant.' + $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From 7e1468db748a0204c0399f789549834b2e1cd8da Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sun, 22 Dec 2019 00:13:48 -0400 Subject: [PATCH 028/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index ba6986a20e9..b81aaf7d6b4 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -2,7 +2,6 @@ const editableFields = [ '#form--input__title', '#form--input__reference-url', '#contract_owner_address', - '#grant_contract_owner_address', '#grant-members', '#amount_goal' ]; From 5de2b32af8388194eb62d6d8befabde50602e8c4 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sun, 22 Dec 2019 00:27:37 -0400 Subject: [PATCH 029/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index b81aaf7d6b4..3fdbb43b3e6 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -13,10 +13,10 @@ $(document).ready(function() { setInterval (() => { notifyOwnerAddressMismatch( $('#grant-admin').text(), - $('#contract_owner_address').text(), + $('#contract_owner_address').html(), '#cancel_grant', 'Looks like your grant has been created with ' + - $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' + $('#grant_contract_owner_address').html() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From bf53ca004dd677097d118e5948eda3e25878454d Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sun, 22 Dec 2019 00:38:41 -0400 Subject: [PATCH 030/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 3fdbb43b3e6..b81aaf7d6b4 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -13,10 +13,10 @@ $(document).ready(function() { setInterval (() => { notifyOwnerAddressMismatch( $('#grant-admin').text(), - $('#contract_owner_address').html(), + $('#contract_owner_address').text(), '#cancel_grant', 'Looks like your grant has been created with ' + - $('#grant_contract_owner_address').html() + '. Switch to take action on your grant.' + $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From 2100e5dd9e62ae18b0db19b5a8eb7eacd3951002 Mon Sep 17 00:00:00 2001 From: Paul <41552663+molecula451@users.noreply.github.com> Date: Sun, 22 Dec 2019 02:16:32 -0400 Subject: [PATCH 031/152] Update detail.js --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index b81aaf7d6b4..467252d0c71 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -16,7 +16,7 @@ $(document).ready(function() { $('#contract_owner_address').text(), '#cancel_grant', 'Looks like your grant has been created with ' + - $('#grant_contract_owner_address').text() + '. Switch to take action on your grant.' + $('#contract_owner_address').text() + '. Switch to take action on your grant.' ); if ($('#cancel_grant').attr('disabled')) { From ab2641fe9b9097b062c38439593748f74e7d1842 Mon Sep 17 00:00:00 2001 From: Dan Lipert Date: Thu, 26 Dec 2019 15:15:54 +0900 Subject: [PATCH 032/152] finish glimpse trial --- app/retail/templates/bounties/funder.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/retail/templates/bounties/funder.html b/app/retail/templates/bounties/funder.html index 9c56387c10f..3a2add77c9a 100644 --- a/app/retail/templates/bounties/funder.html +++ b/app/retail/templates/bounties/funder.html @@ -168,5 +168,5 @@

    {% trans "Who's Using Gitcoin?" %}

    {% include 'shared/analytics.html' %} {% block scripts %}{% endblock %} - + From a904b0500c647601714318e8b88734b1c9eeb074 Mon Sep 17 00:00:00 2001 From: Mulenga Bowa Date: Thu, 26 Dec 2019 23:57:51 +0200 Subject: [PATCH 033/152] escape x-jsrender scripts --- app/dashboard/templates/bounty/details.html | 84 +++++++++---------- .../shared/featured_bounty_cards.html | 10 +-- app/retail/templates/shared/result.html | 32 +++---- 3 files changed, 63 insertions(+), 63 deletions(-) diff --git a/app/dashboard/templates/bounty/details.html b/app/dashboard/templates/bounty/details.html index 7fb5ec6d851..140f88b7722 100644 --- a/app/dashboard/templates/bounty/details.html +++ b/app/dashboard/templates/bounty/details.html @@ -260,15 +260,15 @@
    {% trans "Funder" %}
    diff --git a/app/retail/templates/shared/result.html b/app/retail/templates/shared/result.html index 57bd0bc1ad7..9638f0fe2a5 100644 --- a/app/retail/templates/shared/result.html +++ b/app/retail/templates/shared/result.html @@ -1,14 +1,14 @@ {% load static i18n %} + +
    +
    + +
    +
    +

    CONTRIBUTION HISTORY OVER TIME

    +
    +
    +
    +
    +

    {% trans "Subscription Billing" %}

    +

    {% trans "New Subscriptions" %}

    +

    {% trans "One-Time Contributions" %}

    +

    {% trans "CLR Matching Funds" %}

    +
    +
    +
    + +
    +
    + {% endif %} {% if tab == "contributors" %}
    diff --git a/app/grants/views.py b/app/grants/views.py index 78a36c81f4b..86ebb112881 100644 --- a/app/grants/views.py +++ b/app/grants/views.py @@ -274,11 +274,12 @@ def grant_details(request, grant_id, grant_slug): record_grant_activity_helper('update_grant', grant, profile) return redirect(reverse('grants:details', args=(grant.pk, grant.slug))) + tab = request.GET.get('tab', 'description') params = { 'active': 'grant_details', 'clr_matching_banners_style': clr_matching_banners_style, 'grant': grant, - 'tab': request.GET.get('tab', 'description'), + 'tab': tab, 'title': matching_live + grant.title, 'card_desc': grant.description, 'avatar_url': grant.logo.url if grant.logo else None, @@ -295,9 +296,13 @@ def grant_details(request, grant_id, grant_slug): 'activity_count': activity_count, 'contributors': contributors, 'clr_active': clr_active, - 'is_team_member': is_team_member + 'is_team_member': is_team_member, } + if tab == 'stats': + params['max_graph'] = grant.history_by_month_max + params['history'] = json.dumps(grant.history_by_month) + if add_cancel_params: add_in_params = { 'recommend_gas_price': recommend_min_gas_price_to_confirm_in_time(4), From d999b701e81ec1560dca896d8f00cc8df42a1d84 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Wed, 8 Jan 2020 08:57:17 -0400 Subject: [PATCH 095/152] disabled email notify props for initial release --- app/chat/management/commands/sync_users_to_chat.py | 2 +- app/dashboard/views.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py index 987577e0ff8..9d24f97055c 100644 --- a/app/chat/management/commands/sync_users_to_chat.py +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -50,7 +50,7 @@ def handle(self, *args, **options): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(profile.user.email, 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 60ee7a9ec16..412091a103a 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -123,7 +123,7 @@ def oauth_connect(request, *args, **kwargs): "auth_data": f'{active_user_profile.user.id}', "auth_service": "gitcoin", "notify_props": { - "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True, + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", @@ -409,7 +409,7 @@ def new_interest(request, bounty_id): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(funder_profile.user.email, 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", @@ -441,8 +441,7 @@ def new_interest(request, bounty_id): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(profile.user.email, - 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", From 9e12ced9b23894bf23e0b377e22d731df0f50188 Mon Sep 17 00:00:00 2001 From: Kevin Owocki Date: Wed, 8 Jan 2020 05:58:46 -0700 Subject: [PATCH 096/152] compliance - blocked country and user list (#5602) * blocked country list * typo * some testing cleanu8p * dan feedback --- app/app/settings.py | 3 +- app/compliance/__init__.py | 0 app/compliance/admin.py | 11 +++ app/compliance/apps.py | 5 ++ app/compliance/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../commands/pull_compliance_list.py | 72 +++++++++++++++++++ app/compliance/migrations/0001_initial.py | 47 ++++++++++++ app/compliance/migrations/__init__.py | 0 app/compliance/models.py | 27 +++++++ app/compliance/tests.py | 3 + app/compliance/views.py | 3 + app/dashboard/utils.py | 29 +++++++- scripts/crontab | 1 + 14 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 app/compliance/__init__.py create mode 100644 app/compliance/admin.py create mode 100644 app/compliance/apps.py create mode 100644 app/compliance/management/__init__.py create mode 100644 app/compliance/management/commands/__init__.py create mode 100644 app/compliance/management/commands/pull_compliance_list.py create mode 100644 app/compliance/migrations/0001_initial.py create mode 100644 app/compliance/migrations/__init__.py create mode 100644 app/compliance/models.py create mode 100644 app/compliance/tests.py create mode 100644 app/compliance/views.py diff --git a/app/app/settings.py b/app/app/settings.py index e783a0a5bb1..428b000667a 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -120,7 +120,8 @@ 'event_ethdenver2019', 'inbox', 'feeswapper', - 'oauth2_provider' + 'oauth2_provider', + 'compliance' ] MIDDLEWARE = [ diff --git a/app/compliance/__init__.py b/app/compliance/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/compliance/admin.py b/app/compliance/admin.py new file mode 100644 index 00000000000..2a8d4ca20f5 --- /dev/null +++ b/app/compliance/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin + +from .models import Country, Entity + + +class GeneralAdmin(admin.ModelAdmin): + ordering = ['-id'] + list_display = ['created_on', '__str__'] + +admin.site.register(Country, GeneralAdmin) +admin.site.register(Entity, GeneralAdmin) diff --git a/app/compliance/apps.py b/app/compliance/apps.py new file mode 100644 index 00000000000..82773aa54d0 --- /dev/null +++ b/app/compliance/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ComplianceConfig(AppConfig): + name = 'compliance' diff --git a/app/compliance/management/__init__.py b/app/compliance/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/compliance/management/commands/__init__.py b/app/compliance/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/compliance/management/commands/pull_compliance_list.py b/app/compliance/management/commands/pull_compliance_list.py new file mode 100644 index 00000000000..9186fbde89a --- /dev/null +++ b/app/compliance/management/commands/pull_compliance_list.py @@ -0,0 +1,72 @@ +''' + Copyright (C) 2019 Gitcoin Core + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +''' + +import urllib.request +import xml.etree as etree +import xml.etree.ElementTree as ET + +from django.core.management.base import BaseCommand +from django.db import transaction + +from compliance.models import Country, Entity + + +def insert_countries(): + # clear existing table + Country.objects.all().delete() + + # pull data + countries = 'Balkans, Belarus, Burma, Cote D\'Ivoire , Cuba, Democratic Republic of Congo, Iran, Iraq, Liberia, North Korea, Sudan, Syria, Zimbabwe'.split(',') + + # insert data + for country in countries: + Country.objects.create(name=country) + + +def insert_entities(): + # clear existing table + Entity.objects.all().delete() + + # pull data + url = 'https://www.treasury.gov/ofac/downloads/consolidated/consolidated.xml' + response = urllib.request.urlopen(url).read() + tree = ET.fromstring(response) + + # insert data + for ele in tree: + try: + response = {} + keys = ['firstName', 'lastName', 'sdnType', 'city', 'country', 'program', 'stateOrProvince', 'uid'] + for key in keys: + elements = ele.findall('{http://tempuri.org/sdnList.xsd}' + f'{key}') + element = elements[0].text if len(elements) else '' + response[key] = element + response['fullName'] = (response.get('firstName', '') + ' ' + response.get('lastName', '')).strip() + Entity.objects.create(**response) + except Exception as e: + print(e) + + +class Command(BaseCommand): + + help = 'syncs compliance info from remote server' + + def handle(self, *args, **options): + with transaction.atomic(): + insert_countries() + insert_entities() diff --git a/app/compliance/migrations/0001_initial.py b/app/compliance/migrations/0001_initial.py new file mode 100644 index 00000000000..3e2e3df7352 --- /dev/null +++ b/app/compliance/migrations/0001_initial.py @@ -0,0 +1,47 @@ +# Generated by Django 2.2.4 on 2019-12-05 20:47 + +from django.db import migrations, models +import economy.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Country', + 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)), + ('name', models.CharField(max_length=500)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Entity', + 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)), + ('firstName', models.CharField(max_length=500)), + ('lastName', models.CharField(max_length=500)), + ('fullName', models.CharField(max_length=500)), + ('sdnType', models.CharField(max_length=500)), + ('city', models.CharField(max_length=500)), + ('country', models.CharField(max_length=500)), + ('program', models.CharField(max_length=500)), + ('stateOrProvince', models.CharField(max_length=500)), + ('uid', models.CharField(max_length=25)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/app/compliance/migrations/__init__.py b/app/compliance/migrations/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/compliance/models.py b/app/compliance/models.py new file mode 100644 index 00000000000..7cee697a148 --- /dev/null +++ b/app/compliance/models.py @@ -0,0 +1,27 @@ +from django.db import models + +from economy.models import SuperModel + + +class Entity(SuperModel): + firstName = models.CharField(max_length=500) + lastName = models.CharField(max_length=500) + fullName = models.CharField(max_length=500) + sdnType = models.CharField(max_length=500) + city = models.CharField(max_length=500) + country = models.CharField(max_length=500) + program = models.CharField(max_length=500) + stateOrProvince = models.CharField(max_length=500) + uid = models.CharField(max_length=25) + + def __str__(self): + """Return the string representation of this obj.""" + return f'{self.fullName}' + + +class Country(SuperModel): + name = models.CharField(max_length=500) + + def __str__(self): + """Return the string representation of this obj.""" + return f'{self.name}' diff --git a/app/compliance/tests.py b/app/compliance/tests.py new file mode 100644 index 00000000000..7ce503c2dd9 --- /dev/null +++ b/app/compliance/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/app/compliance/views.py b/app/compliance/views.py new file mode 100644 index 00000000000..91ea44a218f --- /dev/null +++ b/app/compliance/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/app/dashboard/utils.py b/app/dashboard/utils.py index ddd8f580fcc..486c758c041 100644 --- a/app/dashboard/utils.py +++ b/app/dashboard/utils.py @@ -30,6 +30,7 @@ import ipfshttpclient import requests from app.utils import sync_profile +from compliance.models import Country, Entity from dashboard.helpers import UnsupportedSchemaException, normalize_url, process_bounty_changes, process_bounty_details from dashboard.models import Activity, BlockedUser, Bounty, Profile, UserAction from eth_utils import to_checksum_address @@ -822,7 +823,33 @@ def get_tx_status(txid, network, created_on): def is_blocked(handle): - return BlockedUser.objects.filter(handle__iexact=handle, active=True).exists() + # check admin block list + is_on_blocked_list = BlockedUser.objects.filter(handle__iexact=handle, active=True).exists() + if is_on_blocked_list: + return True + + # check banned country list + profiles = Profile.objects.filter(handle__iexact=handle) + if profiles.exists(): + profile = profiles.first() + last_login = profile.actions.filter(action='Login').order_by('pk').last() + if last_login: + last_login_country = last_login.location_data.get('country_name') + if last_login_country: + is_on_banned_countries = Country.objects.filter(name=last_login_country) + if is_on_banned_countries: + return True + + # check banned entity list + if profile.user: + first_name = profile.user.first_name + last_name = profile.user.last_name + full_name = '{first_name} {last_name}' + is_on_banned_user_list = Entity.objects.filter(fullName__icontains=full_name) + if is_on_banned_user_list: + return True + + return False def get_nonce(network, address): diff --git a/scripts/crontab b/scripts/crontab index 436dfb090bf..509acf7af6c 100644 --- a/scripts/crontab +++ b/scripts/crontab @@ -38,6 +38,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/us */8 * * * * cd gitcoin/coin; bash scripts/run_management_command.bash send_tips_for_bounty_fulfiller >> /var/log/gitcoin/send_tips_for_bounty_fulfiller.log 2>&1 35 1 * * * cd gitcoin/coin; bash scripts/run_management_command.bash update_popularity >> /var/log/gitcoin/update_popularity.log 2>&1 */7 * * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash update_tx_status >> /var/log/gitcoin/update_tx_status.log 2>&1 +1 3 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash pull_compliance_list >> /var/log/gitcoin/pull_compliance_list.log 2>&1 ## REPORTING 1 1 1 * * cd gitcoin/coin; bash scripts/run_management_command.bash activity_report $(date --date='-1 month' +%Y/%m/%d) $(date +%Y/%m/%d) >> /var/log/gitcoin/activity_report.log 2>&1 From cc84f8b5f306c354daf7549a76484a8f0e957292 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 29 Nov 2019 16:58:58 -0400 Subject: [PATCH 097/152] Mattermost Driver added - bounty on create task added to dashboard/tasks.py - chat/tasks.py created - wip tasks wip commit --- app/chat/tasks.py | 48 +++++++++++++++++++++++++++++++++++ app/chat/templates/embed.html | 2 -- app/chat/views.py | 9 +++---- app/dashboard/helpers.py | 4 +-- app/dashboard/tasks.py | 35 +++++++++++++++++++++++-- requirements/base.txt | 1 + 6 files changed, 87 insertions(+), 12 deletions(-) create mode 100644 app/chat/tasks.py diff --git a/app/chat/tasks.py b/app/chat/tasks.py new file mode 100644 index 00000000000..bfdaa322b3d --- /dev/null +++ b/app/chat/tasks.py @@ -0,0 +1,48 @@ +from django.conf import settings + +from app.redis_service import RedisService +from celery import app, task +from celery.utils.log import get_task_logger + +from mattermostdriver import Driver + +mm_driver = Driver({ + 'url': settings.CHAT_URL, + 'login_id': settings.CHAT_DRIVER_USER, + 'password': settings.CHAT_DRIVER_PASS, + 'token': settings.CHAT_DRIVER_TOKEN +}) + +mm_driver.login() + +logger = get_task_logger(__name__) + +redis = RedisService().redis + +# Lock timeout of 2 minutes (just in the case that the application hangs to avoid a redis deadlock) +LOCK_TIMEOUT = 60 * 2 + + +@app.shared_task(bind=True, max_retries=3) +def create_channel(self, opts, retry: bool = True) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): + + try: + mm_driver.channels.create_channel(options={ + 'team_id': opts['team_id'], + 'name': opts['channel_name'], + 'display_name': opts['channel_display_name'], + 'type': 'O' + }) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/app/chat/templates/embed.html b/app/chat/templates/embed.html index 135fc9caa61..d5e1df1cec3 100644 --- a/app/chat/templates/embed.html +++ b/app/chat/templates/embed.html @@ -56,7 +56,5 @@
    {% include 'shared/analytics.html' %} {% include 'shared/footer_scripts.html' with slim=1 %} - - diff --git a/app/chat/views.py b/app/chat/views.py index 1361302c41a..52540d9651d 100644 --- a/app/chat/views.py +++ b/app/chat/views.py @@ -18,7 +18,6 @@ """ - from django.conf import settings from django.template.response import TemplateResponse from django.templatetags.static import static @@ -33,9 +32,9 @@ def embed(request): is_staff = request.user.is_staff if request.user.is_authenticated else False - if not is_staff: - context = dict(active='error', code=404, title="Error {}".format(404)) - return TemplateResponse(request, 'error.html', context, status=404) + # if not is_staff: + # context = dict(active='error', code=404, title="Error {}".format(404)) + # return TemplateResponse(request, 'error.html', context, status=404) context = { 'is_outside': True, @@ -43,8 +42,6 @@ def embed(request): 'title': 'Chat', 'card_title': _('Community Chat'), 'card_desc': _('Come chat with the community'), - 'avatar_url': static('v2/images/helmet.png'), - 'is_chat_user': False, 'chat_url': settings.CHAT_URL } diff --git a/app/dashboard/helpers.py b/app/dashboard/helpers.py index ec77acfee14..e4bfa0c14ad 100644 --- a/app/dashboard/helpers.py +++ b/app/dashboard/helpers.py @@ -524,12 +524,12 @@ def create_new_bounty(old_bounties, bounty_payload, bounty_details, bounty_id): latest_old_bounty_dict['coupon_code'] = Coupon.objects.get(pk=latest_old_bounty_dict['coupon_code']) bounty_kwargs.update(latest_old_bounty_dict) - + # bounty_on_create.delay() try: print('new bounty with kwargs:{}'.format(bounty_kwargs)) new_bounty = Bounty.objects.create(**bounty_kwargs) merge_bounty(latest_old_bounty, new_bounty, metadata, bounty_details) - + bounty_on_create.delay(new_bounty) except Exception as e: print(e, 'encountered during new bounty creation for:', url) logger.error(f'{e} encountered during new bounty creation for: {url}') diff --git a/app/dashboard/tasks.py b/app/dashboard/tasks.py index 49000c48bac..98bf2922e1c 100644 --- a/app/dashboard/tasks.py +++ b/app/dashboard/tasks.py @@ -1,7 +1,8 @@ from django.conf import settings from app.redis_service import RedisService -from celery import app +from celery import app, group +# from chat.tasks import create_channel from celery.utils.log import get_task_logger from dashboard.models import Profile from marketing.mails import func_name, send_mail @@ -15,6 +16,33 @@ LOCK_TIMEOUT = 60 * 2 +@app.shared_task(bind=True, max_retries=3) +def bounty_on_create(self, team_id, new_bounty, retry: bool = True) -> None: + # what has to happen that we want to chain data from one another together + + tasks = list() + + tasks.append( + create_channel.si({ + 'team_id': team_id, + 'channel_name': f'bounty-{new_bounty.id}', + 'channel_display_name': f'bounty-{new_bounty.id}' + }) + ) + + # what has to happen that we can issue without a dependency from any subtasks? + + # look up users in your tribe invite them to the newly issued bounty + + tasks.append( + bounty_emails.si([], "", "", "", False) + ) + + res = group(tasks) + + res.ready() + + @app.shared_task(bind=True, max_retries=3) def bounty_emails(self, emails, msg, profile_handle, invite_url=None, kudos_invite=False, retry: bool = True) -> None: """ @@ -46,5 +74,8 @@ def bounty_emails(self, emails, msg, profile_handle, invite_url=None, kudos_invi ) except ConnectionError as exc: - print(exc) + logger.info(str(exc)) + logger.info("Retrying connection") self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/requirements/base.txt b/requirements/base.txt index 167025289c2..744e061256d 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -85,3 +85,4 @@ websocket-client bleach python-magic django-oauth-toolkit +mattermostdriver From bb474a3bcfc69a831882dbda7a37296cde0c82cc Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 3 Dec 2019 15:50:33 -0400 Subject: [PATCH 098/152] Initial Documentation for Gitcoin Mattermost Setup --- docs/RUNNING_CHAT_LOCALLY_DOCKER.md | 67 +++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/RUNNING_CHAT_LOCALLY_DOCKER.md diff --git a/docs/RUNNING_CHAT_LOCALLY_DOCKER.md b/docs/RUNNING_CHAT_LOCALLY_DOCKER.md new file mode 100644 index 00000000000..9b0a292fb34 --- /dev/null +++ b/docs/RUNNING_CHAT_LOCALLY_DOCKER.md @@ -0,0 +1,67 @@ +# Running Locally with Docker (Recommended) + +```shell +git clone https://github.com/gitcoinco/mattermost-server.git +git clone https://github.com/gitcoinco/mattermost-client.git + +``` + + + +## Mattermost Developer Setup + +Follow the instructions at https://developers.mattermost.com/contribute/server/developer-setup/ + + +You want `mattermost-server` and `mattermost-client` in the same parent directory + +Server commands are scripted with a relative path to the client at ../mattermost-client + +## Startup server + +### Running in Detached mode + +Runs the server with its dependencies on docker, conflicts with other services presently +```shell +make run-server +``` + +### Developing with the command line shell + +```shell +make run-cli +``` + +### Debugging + +```shell +make debug-server +``` + + +### Viewing Logs + +Actively follow a container's log: + +```shell +docker-compose logs -f mattermost # Or any other container name +``` + +View all container logs: + +```shell +docker-compose logs +``` + +Navigate to `http://localhost:8065/`. + + +You will need to edit the `config/config.json` file with your local environment variables. Look for config items that are marked `# required`. + +## Gitcoin Integration Setup (recommended) + +If you plan on using the Gitcoin integration, please read this first [Django Oauth Toolkit - Register an application](https://django-oauth-toolkit.readthedocs.io/en/latest/rest-framework/getting_started.html#step-3-register-an-application). + +Create an Application on your local copy of Gitcoin and enable skip authorization. + +Once you have those keys you will have to update the `GitCoinSettings` key in `config/config.json` file with the new application keys created above. From 48d1fe5d8a8feb805bbdadd6462d9289d30dee05 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 6 Dec 2019 12:02:20 -0400 Subject: [PATCH 099/152] Auto reload the workers in development environments to aid in celery task development --- app/__init__.py | 0 app/app/settings.py | 2 ++ app/taskapp/management/__init__.py | 0 app/taskapp/management/commands/__init__.py | 0 app/taskapp/management/commands/celery.py | 19 +++++++++++++++++++ bin/celery/worker/run.sh | 2 +- 6 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 app/__init__.py create mode 100644 app/taskapp/management/__init__.py create mode 100644 app/taskapp/management/commands/__init__.py create mode 100644 app/taskapp/management/commands/celery.py diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/app/settings.py b/app/app/settings.py index e783a0a5bb1..796ec7e3b46 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -467,6 +467,8 @@ CELERY_TASK_SERIALIZER = 'json' # http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_serializer CELERY_RESULT_SERIALIZER = 'json' +# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_backend +CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND', default=CACHEOPS_REDIS) DJANGO_REDIS_IGNORE_EXCEPTIONS = env.bool('REDIS_IGNORE_EXCEPTIONS', default=True) DJANGO_REDIS_LOG_IGNORED_EXCEPTIONS = env.bool('REDIS_LOG_IGNORED_EXCEPTIONS', default=True) diff --git a/app/taskapp/management/__init__.py b/app/taskapp/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/taskapp/management/commands/__init__.py b/app/taskapp/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/taskapp/management/commands/celery.py b/app/taskapp/management/commands/celery.py new file mode 100644 index 00000000000..ab13bf4c98b --- /dev/null +++ b/app/taskapp/management/commands/celery.py @@ -0,0 +1,19 @@ +import shlex +import subprocess + +from django.core.management.base import BaseCommand +from django.utils import autoreload + + +def restart_celery(): + kill_worker_cmd = 'pkill -9 celery' + subprocess.call(shlex.split(kill_worker_cmd)) + start_worker_cmd = 'celery -A taskapp worker -l INFO' + subprocess.call(shlex.split(start_worker_cmd)) + + +class Command(BaseCommand): + + def handle(self, *args, **options): + self.stdout.write('Starting celery worker with autoreload...') + autoreload.run_with_reloader(restart_celery) diff --git a/bin/celery/worker/run.sh b/bin/celery/worker/run.sh index df2bd3fcbb0..e5604fd5553 100644 --- a/bin/celery/worker/run.sh +++ b/bin/celery/worker/run.sh @@ -2,4 +2,4 @@ set -euo pipefail -celery -A taskapp worker -l INFO +cd /code/app; python3 manage.py celery From ed04cb53cd9404ba71ff3256eaac7e41836202ba Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 13:59:55 -0400 Subject: [PATCH 100/152] WIP commit, mgmt sync users to chat cmd added, chat celery tasks updated --- app/chat/management/__init__.py | 0 app/chat/management/commands/__init__.py | 0 .../management/commands/sync_users_to_chat.py | 81 ++++++++++++ app/chat/tasks.py | 115 +++++++++++++++++- 4 files changed, 190 insertions(+), 6 deletions(-) create mode 100644 app/chat/management/__init__.py create mode 100644 app/chat/management/commands/__init__.py create mode 100644 app/chat/management/commands/sync_users_to_chat.py diff --git a/app/chat/management/__init__.py b/app/chat/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/management/commands/__init__.py b/app/chat/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py new file mode 100644 index 00000000000..f478451c52e --- /dev/null +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -0,0 +1,81 @@ +''' + Copyright (C) 2018 Gitcoin Core + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +''' + +from django.core.management.base import BaseCommand +from dashboard.models import Profile +from chat.tasks import create_user +import logging +from celery import group + +logger = logging.getLogger(__name__) + +from marketing.utils import should_suppress_notification_email + + +class Command(BaseCommand): + help = "create users to Gitcoin chat, creates the user if it doesn't exist" + + def handle(self, *args, **options): + try: + + invite_token = '' + users = Profile.objects.filter(user__is_active=True).prefetch_related('user') + + tasks = [] + + for profile in users: + # if profile.chat_id is None: + print(profile) + tasks.append(create_user.si(options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": "false" if should_suppress_notification_email(profile.user.email, 'chat') else "true", + "push": "mention", + "desktop": "all", + "desktop_sound": "true", + "mention_keys": f'{profile.handle}, @{profile.handle}', + "channel": "true", + "first_name": "false" + }, + }, params={ + "iid": invite_token + })) + print(tasks) + job = group(tasks) + + result = job.apply_async() + + print(result.ready()) + + print(result.successful()) + + print(result.get()) + + except ConnectionError as exec: + print(str(exec)) + self.retry(30) + except Exception as e: + logger.error(str(e)) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index bfdaa322b3d..c00ec4c3d25 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,20 +1,17 @@ from django.conf import settings from app.redis_service import RedisService -from celery import app, task +from celery import app, group +from dashboard.models import Profile from celery.utils.log import get_task_logger - from mattermostdriver import Driver mm_driver = Driver({ 'url': settings.CHAT_URL, - 'login_id': settings.CHAT_DRIVER_USER, - 'password': settings.CHAT_DRIVER_PASS, + 'port': 443, 'token': settings.CHAT_DRIVER_TOKEN }) -mm_driver.login() - logger = get_task_logger(__name__) redis = RedisService().redis @@ -32,6 +29,7 @@ def create_channel(self, opts, retry: bool = True) -> None: """ with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): + mm_driver.login() try: mm_driver.channels.create_channel(options={ @@ -46,3 +44,108 @@ def create_channel(self, opts, retry: bool = True) -> None: self.retry(30) except Exception as e: logger.error(str(e)) + + +@app.shared_task(bind=True, max_retries=0) +def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:sync_gitcoin_users_to_chat", timeout=60 * 10): + + try: + mm_driver.login() + + users = Profile.objects.filter(user__is_active=True).prefetch_related('user') + + tasks = [] + + for profile in users: + # if profile.chat_id is None: + print(profile) + tasks.append(create_user.si(options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True + } + }, params={ + "iid": invite_token if invite_token else "" + })) + print(tasks) + job = group(tasks) + + result = job.apply_async() + + print(result.ready()) + + print(result.successful()) + + print(result.get()) + + except ConnectionError as exec: + print(str(exec)) + self.retry(30) + except Exception as e: + logger.error(str(e)) + + +@app.shared_task(bind=True, max_retries=1) +def create_user(self, options, params, retry: bool = True): + with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): + mm_driver.login() + + try: + create_user_response = mm_driver.users.create_user(options=options, params=params) + + return create_user_response + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) + return None + + +@app.shared_task(bind=True, max_retries=3) +def update_user(self, user, update_opts, retry: bool = True) -> None: + """ + :param self: + :param user: + :param update_opts: + :param retry: + :return: None + """ + + if update_opts is None: + return + + with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): + mm_driver.login() + + try: + if user.profile.chat_id is None: + chat_user = mm_driver.users.get_user_by_username(user.profile.handle) + if chat_user is None: + raise ValueError(f'chat_user id is None for {user.profile.handle}') + user.profile.chat_id = chat_user.id + user.profile.save() + + mm_driver.users.update_user(user.chat_id, options=update_opts) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) From 68418975cf50fc5d634acd8428fa707524f4d846 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 14:03:52 -0400 Subject: [PATCH 101/152] Settings for 1.2(mattermost driver) --- app/app/settings.py | 5 ++++- app/chat/__init__.py | 1 - app/chat/apps.py | 21 +++++++++++++++++++++ app/dashboard/models.py | 1 + app/dashboard/tasks.py | 2 +- app/retail/emails.py | 6 +++++- 6 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/app/settings.py b/app/app/settings.py index 796ec7e3b46..5cca2bdf0d0 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -91,6 +91,7 @@ 'health_check.contrib.s3boto3_storage', 'app', 'avatar', + 'chat', 'retail', 'rest_framework', 'marketing', @@ -543,7 +544,9 @@ GITHUB_APP_NAME = env('GITHUB_APP_NAME', default='gitcoin-local') # Chat -CHAT_URL = env('CHAT_DRIVER_USER', default='') # location of where mattermost is hosted +CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted +CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted +CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='aomj4f4kgbyazyy6qd3kx4a7dc') # driver token # Social Auth LOGIN_URL = 'gh_login' diff --git a/app/chat/__init__.py b/app/chat/__init__.py index 5322f097c64..e69de29bb2d 100644 --- a/app/chat/__init__.py +++ b/app/chat/__init__.py @@ -1 +0,0 @@ -default_app_config = 'inbox.apps.NotificationConfig' diff --git a/app/chat/apps.py b/app/chat/apps.py index fbbc2705e9c..8af23f63631 100644 --- a/app/chat/apps.py +++ b/app/chat/apps.py @@ -1,3 +1,24 @@ +# -*- coding: utf-8 -*- +"""Define the Dashboard application configuration. + +Copyright (C) 2018 Gitcoin Core + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +""" +from __future__ import unicode_literals + from django.apps import AppConfig diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 3370559e49b..1802203441f 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -2314,6 +2314,7 @@ class Profile(SuperModel): last_calc_date = models.DateTimeField(default=get_time) email = models.CharField(max_length=255, blank=True, db_index=True) github_access_token = models.CharField(max_length=255, blank=True, db_index=True) + chat_id = models.CharField(max_length=255, blank=True, db_index=True) pref_lang_code = models.CharField(max_length=2, choices=settings.LANGUAGES, blank=True) slack_repos = ArrayField(models.CharField(max_length=200), blank=True, default=list) slack_token = models.CharField(max_length=255, default='', blank=True) diff --git a/app/dashboard/tasks.py b/app/dashboard/tasks.py index 98bf2922e1c..64369b7b714 100644 --- a/app/dashboard/tasks.py +++ b/app/dashboard/tasks.py @@ -2,7 +2,6 @@ from app.redis_service import RedisService from celery import app, group -# from chat.tasks import create_channel from celery.utils.log import get_task_logger from dashboard.models import Profile from marketing.mails import func_name, send_mail @@ -19,6 +18,7 @@ @app.shared_task(bind=True, max_retries=3) def bounty_on_create(self, team_id, new_bounty, retry: bool = True) -> None: # what has to happen that we want to chain data from one another together + # from chat.tasks import create_channel tasks = list() diff --git a/app/retail/emails.py b/app/retail/emails.py index 66c963912fb..08a6ac247b7 100644 --- a/app/retail/emails.py +++ b/app/retail/emails.py @@ -64,7 +64,11 @@ ('featured_funded_bounty', _('Featured Funded Bounty Emails'), _('Only when you\'ve paid for a bounty to be featured')) ] -ALL_EMAILS = MARKETING_EMAILS + TRANSACTIONAL_EMAILS +NOTIFICATION_EMAILS = [ + ('chat', _('Chat Emails'), _('Only emails from Gitcoin Chat')) +] + +ALL_EMAILS = MARKETING_EMAILS + TRANSACTIONAL_EMAILS + NOTIFICATION_EMAILS def premailer_transform(html): From 8e36e4d5c525750eeefce610b6f5130e64b1eaa6 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 10 Dec 2019 14:17:38 -0400 Subject: [PATCH 102/152] remove default token for chat driver --- app/app/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app/settings.py b/app/app/settings.py index 5cca2bdf0d0..283d045c0e0 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -546,7 +546,7 @@ # Chat CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted -CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='aomj4f4kgbyazyy6qd3kx4a7dc') # driver token +CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='') # driver token # Social Auth LOGIN_URL = 'gh_login' From 8ebe51f506ca58e68bed3b74778f3b1d7236a309 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sun, 15 Dec 2019 16:10:46 -0400 Subject: [PATCH 103/152] adding email supression check into the oauth route --- app/dashboard/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/dashboard/views.py b/app/dashboard/views.py index b46d7e793d3..5ec716d6cad 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -75,7 +75,7 @@ from marketing.mails import ( new_reserved_issue, share_bounty, start_work_approved, start_work_new_applicant, start_work_rejected, ) -from marketing.models import Keyword +from marketing.models import Keyword, EmailSubscriber from oauth2_provider.decorators import protected_resource from pytz import UTC from ratelimit.decorators import ratelimit @@ -113,13 +113,16 @@ @login_required() def oauth_connect(request, *args, **kwargs): active_user_profile = Profile.objects.filter(user_id=request.user.id).select_related()[0] - + from marketing.utils import should_suppress_notification_email user_profile = { "login": active_user_profile.handle, "email": active_user_profile.user.email, "name": active_user_profile.user.get_full_name(), "handle": active_user_profile.handle, "id": active_user_profile.user.id, + "notifyProps" : { + "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True + } } return JsonResponse(user_profile, status=200, safe=False) From 7ce4f12fefd2da0e3a80e1f36ac96b6ee3085758 Mon Sep 17 00:00:00 2001 From: Onuwa Nnachi Isaac Date: Sun, 8 Dec 2019 01:14:47 +0100 Subject: [PATCH 104/152] Add chat page --- app/app/urls.py | 1 + app/assets/v2/css/chat.css | 39 +++++ app/assets/v2/images/chat/android.png | Bin 0 -> 246 bytes app/assets/v2/images/chat/apple.png | Bin 0 -> 224 bytes app/assets/v2/images/chat/chat.png | Bin 0 -> 88556 bytes app/assets/v2/images/chat/desktop.png | Bin 0 -> 2983 bytes app/assets/v2/images/chat/mobile.png | Bin 0 -> 1734 bytes .../images/chat/placeholder_feature_image.png | Bin 0 -> 2271 bytes app/assets/v2/images/chat/web.png | Bin 0 -> 3097 bytes app/assets/v2/images/chat/windows.png | Bin 0 -> 197 bytes app/retail/templates/chat.html | 148 ++++++++++++++++++ app/retail/views.py | 3 + 12 files changed, 191 insertions(+) create mode 100644 app/assets/v2/css/chat.css create mode 100644 app/assets/v2/images/chat/android.png create mode 100644 app/assets/v2/images/chat/apple.png create mode 100644 app/assets/v2/images/chat/chat.png create mode 100644 app/assets/v2/images/chat/desktop.png create mode 100644 app/assets/v2/images/chat/mobile.png create mode 100644 app/assets/v2/images/chat/placeholder_feature_image.png create mode 100644 app/assets/v2/images/chat/web.png create mode 100644 app/assets/v2/images/chat/windows.png create mode 100644 app/retail/templates/chat.html diff --git a/app/app/urls.py b/app/app/urls.py index 4ddfd861ee1..09f831cc2b5 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -352,6 +352,7 @@ re_path(r'^pricing/$', retail.views.pricing, name='pricing'), re_path(r'^subscribe/$', retail.views.subscribe, name='subscribe'), re_path(r'^about/?', retail.views.about, name='about'), + re_path(r'^chat/?', retail.views.chat, name='chat_page'), re_path(r'^mission/?', retail.views.mission, name='mission'), re_path(r'^jobs/?', retail.views.jobs, name='jobs'), re_path(r'^vision/?', retail.views.vision, name='vision'), diff --git a/app/assets/v2/css/chat.css b/app/assets/v2/css/chat.css new file mode 100644 index 00000000000..867d0c5b7df --- /dev/null +++ b/app/assets/v2/css/chat.css @@ -0,0 +1,39 @@ +.banner { + background-color: #0d023b; + background-size: cover; + background-position: 0px 0px; + background-repeat: no-repeat; + position: relative; + color: #fff; + padding-top: 5rem; + padding-bottom: 5rem; +} + +.sub-headline { + line-height: 48px; +} + +.online { + color: #25e899; +} + +.dot { + background-color: #25e899; + display: none; + width: 9px; + height: 9px; + border-radius: 50%; + position: absolute; + top: 0.5em; + right: 0.9em; +} + +@media (max-width: 1024px) { + .chat-img { + display: none; + } +} + +.open-app { + background-color: #0D001A; +} \ No newline at end of file diff --git a/app/assets/v2/images/chat/android.png b/app/assets/v2/images/chat/android.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbad34ce0fc61b9d4e49bec30a9b511fd1eeae5 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRO!3HEZ#7tid5-9M9EM{Qf76xHPhFNnYfP#$0 zLGDfr>(0r%1aer?9eo`c7&i8E|4C#8^1D4<978G?djmRoTMT%-1({2lADivqUANkR zQ&~}sL9Ib_MuU-K;e_r}>WL?dQq;YolwCL;vVTl)%r-ez;n}!MOD1rxG#8umBI6$y zZQK(V?ppQO=ZfGTrT8KdW?uF17ruIr7lyrCxbN%});RO23I8XUpZTtz@$=7$t-sm@ nCHfxDe|4!;aNe9rRfoAgoGI))9adckbQXiBtDnm{r-UW|HBeM9 literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/apple.png b/app/assets/v2/images/chat/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3f8ab777bad12721b718d2dbcf267a18f7bab5 GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRQ!3HGLSWEVS1PVMNiy0WWg+Z8+Vb&Z8pde#$ zkh>GZx^prwfgF}}M_)$E)e-c@N{8CRB$B+uf+WtV^1_K@!cCG^lRUR;CPc~q0 zU{cYsIKUWmfYCyue97PBy-!jjt9O?v{_$`Lo8au5p;pkGvGtggh1-XQd8!v))-FsG zil4dcvf-OKSDGYV?aB$%fBBnXvYC44X>qmEUyGKdD6`9Yb6H$5*!-XA(xTlLZ$})= Q1v-Gi)78&qol`;+0G0wtQvd(} literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/chat.png b/app/assets/v2/images/chat/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad17074af87af9dc940c79190dd8ea55b2d1f2a GIT binary patch literal 88556 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

    U`xlo?cQ|C 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 dZ12dkfQr5sis7nNujcev6v2Za&+69~19 zl$BXkhB}Z5M1DY=(Q!~c{LDMB!?q&gZ?T6Vl=?Z+=7@J3Fc}hjY6Blvu)XqF&?0)c zZ{}0j!Idb7-3vk?%PmU&KksuN&;PO70y042PAN@*fw6r&heOUcfV?8jokzfro{2{O zDuK^zAf0ZP0RR$7qFoh=AmB#JqAvaCz>S%OxQ+iD(Dz7c-<;B5_IA7T3da+fnaOk} zyVeM^x`)x(98q?V9;=b~xxVT-Y?DkN_&1i6H7vZdIFeP!5-8H#ZPmO3deuXwMT8?j z+oE%}L#o8q3*p^!!Mk6~FdT23KFP~2&!&0Dx|h|99^VRB8sYs^n<8mC#} zMsi{XVj*M{j?|+g+?jt|l(;*qSjmOeY22F-WZ@#bMm%N)5#9!Ycv)I!hW|||{Jz9P z!u%FGET!Ns=i!j&ci8aD#i*O;Hh8$1c`o{J6sl=15JSC#*G8Jf~iw?&GotZo(K*3WiS$rlODr8N4oAJY8sk(4|F3tbE* z-2f-f(JtlO7g>OIf=mc#kUEm&Zu*eiQcQ&V=4!C3Ts)6T{_ZO#R%O!kUxi6qNF_~y zIj7d6Pw@~!aPz!@_qTkWd@dXa)~u&%fiwqsk;$Ng9!15d!>0YonQ~yrEK5ix9X1|_ z0?G;=qz6GEjGc{@Dd9aO1T{Y{O zisNu7H#P6>GB~x}PM=E3F)AR81{>mbZKCA`TW(2-c+{V!X33(51_uV5LEq@1z75cf z=V3E(n_c}K1jsCqKrIoQpwR^H$oPfZT{n8yxgKbmue15VSEu+b6(VZ9mLo_fP38 z*(yJ~ms)I+Mo$?D_u%7}q9iYMW&> zmM3YkwpWrx4{I>DrU*e3RVH=$`JlTz<&0jU#8;q11DeHAj;R-h2!yksNhKBt-8^z& z14?VU&+!gOghH5%0X4YvYMo6(N=zP~A01#=yjUt(6 zhlO2k+eq#%iBThGKOgVo%!2zH*dga_f4xqQBTrcTvS%Tn2KuS(^6BqME2mg;g4OP< zVW2zU?WJjjxyAU{5Yh%|`PWi`!cFE8IV{WZSw>+`9zheh3-CTNshW5D0K zyF9Slg515oyX_D%n@sQWzX-oMFuhe$V;dK7Fy1JXY`S8ZwYP8WquIjF;efOz3xr?+ z(SNjr=w(l!$LXRYClAlfXVcm$x5ut#$sRm-+MHdm{OUK z`zD^4WePM?IJctE;B+4r@{U=K2&%pdZjNKB=+^o&Q|YXwWi758FC9hXMK_-DJqP}` z`=A&5|34HXij9;1hrPFsit20QM-c%*6cnUWQ9v5$4iyjv2?=SCEKi;%3oQ@8sG0n5Si7(}8lMccHcAzxm(u&)P&C1KIAr5^*=zGb!E!-P-PGxS%v;;wY6Hy?X-21S!} z#M=(cAUj&lAmJS`@>hw{Y0Cfow4ciIeWB$>6YX`LqdXHZ*;`n{1wRff`HY6IdF`G? zwGNky9;uur&Uq*RvVGQ9;GJL=?apT!l*+U#3VAsv(xCtSNV^AWy3N8dEL!)tCUZ@P z^czwn+bi$;do?=2`yaHfrp(02-vkk&cQIqT^Von_i+9iQPt^_&jIveR6@(k;&wETo z6Xo$Py+wH{|2>jP1$3XWhG888H{P48zB@_KNr1v~)NkWBZ;zj~A0&grN-$@EIllE$ z;zuP#YWVem(}o|z`GBYA?Q2KtX?~~rqfg5d+f`xw9`ee!TpnTrCa>J-DI6$?%Q17~ zacvD`+7=9n(f9~N! z8}Q2`d-cDFKX>2ycHf8g_Z@)i^3U4s|7+&|ccST|Ge5sf2|`0_BJiQTJgbzojXOsyJy7xxy~L3b~i)!SbCB*gaRX>RNc`xOs(-y9=CQX_X0 z;wVP> z_4_X;XDdb-Uo#`YWtY)j2L0k=`j0xh_2a~;6>qN`^De9bQgoufa$vo29?BEA)6Wv1 z77MQ?z>ad}U1xkL?UOx5_vSl05BNIP)^@4A9-7eDH?qY5kBu%A8@quPp~u6?r@2^D z-cvkuhvfNV&8wNfziLHJ)p+lLr)J2}>5LM;!_qZifw}D1RVePVPx@~fxoe~!0p0^{ zQ^JqGpnjKsNBiGA`JZt4pQ!xb`tnQOU5SMMt(N~&G5)78{ZGsEp}i6ZmmmMrng72S z8j7m6BL$?^6oE(hnTG1PcX1bX{7LG$Yc6dfv?UDzK_E@#Yx&E3nqFnG9d_sXb7 z+mWU30xz5%d4huRui5}TTy>yzc@^Smu?1xPv0498HJN0G2<#VzIhjT8UUq~-DXG#2 z*!zV4aC!LZ0$X2`&Mx^YT~@!HpW%9&DrW=jSD(vkTOY>}(S!rK_vH`8_5SbTw%iYj ziEGrZG+cgj^O>E~qu|SbddoWZWBLLJPqVLxUz+k`iy)xP-<9KzNkcWsu=_58rK!^% zP^PWI!k_CEk%2u;FYiQK4I8WDS^4S}lu)i0ZmQ|d=+tqA)Z=)tf|bCE;S=-enF)9@QLGaa^_C|8AYD zy>FK$9F+u1;JDK4fy$gowBt@qH-r|hZ~|y+!8~0aP4p{Q9apKa=lo@Uy2$f}UUraU z=yySY%OC&etoB{txp; z3)-!o=??--rHsQB(Q+zt99s6P{ktip&Z&HIA6%^&lc{uaWBbp$0>~3bCML42wVYfw zwG_NC|9l7U@&~loNgaM@@}xUC)qG~hLCgv_&{6F^hBG#Eq9%H_LWFm?ecFn(Y6{mC zgHbMxyhUEBe?9<>gCK^Dv-aCNw*3>6J_0t@NAQYPowwyIh)u~tM7>qz#Mu(uzNLA| z)2|O!_UlfLA+`Kv-_ku~;MH&a44o|m1O1d-1zUZu23w}Yo!BfgxLqZxaKl7HGn%fY zqSv*=u0_=0#JLFP*4v28+i;lSm6zb3j(E3WV=sI%n7n3F!!onzS={rU(q2!05Spo` zCq9UQ>9xl1hj}GE|GB{h8~Z_Nyiyx->Gi80W^qzq1B#lR+8|;3b(EzB5oNUhTz7f4 zU4KCPv8f8GBWiWvk1pq6uCb=Ox4LwmifVBT+YebZ3y#2jtJ^4r6tS&^d+kt<^7Rs< zfpP$Hn-w;?ua}n=Y`99K#~~ zyP3Q9Ck8I^&wqrA-ADU|HFr8$yPw_FoY5b4m7g8kplVV7WAoJG!PQga%t%nE!0(5j zSUw2|_<8@(IKqWY80|gT^T$YmO*t;d!269mPhgFpqh+k-G6rF^9gs*+HbmY(XH3+%Oi*$KDx8GKe&mkGADsni z6cb#NFd`bhcVylJB{9EE`PuNiEx*}?Bh9(T*P>QB=CG#<=gGoV5c;3{zKM8V(`fe_ z0vYP?hE`iw&UDy3UPw`I*MX|(wf5Ul`a{ElrnBkS^PWVDm}?Ca99d}mNLp1m^4M@F z&85%23;y<`I4nkVTNlCk*R1)5iGdMG1mD%%;9h2Rq}O)lptWYJ7**0v>yMbTTnrwM zA%F|yc$lL50^4Rq$(n1*7JQ^vouz<%l2HzR(;s!N4^dorW&eCgU?34K)8--9hk-Y~ zi6&cnuo+7|z7J>r^#AG{M~Q*KxlCOHY?@Q?y>>O)2}!s+#q=Vih@PEQ+J@+8U+TGx zboWiiCuYnBsE2dM;A>z7_HC1FZdR`X#Y6&gcE-9ox{StlbE0gX{6h@ZGdH*V2kG_{ z7-#+C=)NCtY!f2C=)NAj|L96z`lo3lE_C0xC-hc_0JR~D_wcy!h_Lpq3bt~*>TB;j>vz+F+()?C4^dQhFP z8`B=dnANon&&0wzs`rha)jBiqh$QSwp~4ok@d)glPo)C&6h@-+3hVR-kF|2U9t2Fk z!nbgb6JM1?S~Rc0#aRC7+tqpEqc?4ipLrVU(*P7bv=nNj=~$jMo5wi#xTQFp1`h2t z`eu@{Vkaztg*4*K;vzH@VR>!T6Ag23ulAFkZZ|5 z(YM+0%q%rzh7BK2T=#t^eHxQez&d!?{onxW?94}$jvz3vvhvlu?dx5aX)VwoT(TE+ z-N)OvEiEW0NJUe#prWGU+%|=1$I?bMFd_Kqs`U;|3sBash0U<`_B0GMjIjP($ zsOD$vs)4M^w+{J{_Z{C-iTM=N<+}841^hzhN_YN;xZgwpcFU)KLK(-|!jPWuTA4x8 z6QXn%dYb{Pn&2>Eso|FYHP_TMwovF^guNiC+2pm%p*$eeKQc43U4284&TNuv%B0;7 zD2YAm3Hq#WY@E%+#MG3Qf`cnHV+hAPsje*&r+C0Q10^2%DI-htBENMe0D;~m)0j){ zG{9$}HAzuX)hwKM81%;R*uw)h&qn{vtUo<7^Xc;PvInB43cCS?p9TFHuIHmKCi$0= zD((b`!xvm+^WtCZma4H5ynoDRcnhA1Chx!4ERdX3ewAVL12mjseoOe>f*(miPY6CW zZskC)XCD-(qvH=0f-Y!slHmHpzg#=2sg~6>vn*X+N9@>DmBE({b&)+cl5MM6`kWbM z{P?Yw?1`1*2PC!MHBJH~;-JgX*hSi-q*_YtyzFCE~sc$mq!&Wnq=9|@zNV1odWexLFkhj zO0=8%q`HJy!j2nJutQVL3;G~)1}hsIq!e*tTAGHetn5h_zEFDFtYhp<7#(w@io}!b z2r$*yx_x-V)FY6b{*PY9C7=6Zgtxeh1L!Huh%3FgX2<>Rfx%#iV#Zw=AtooJSS0q} zQhLJQo0fk1ncwxsGf@vOr}%`MXB!7vPa+%iCzX`ChniCA1h1Q79iCfg2D4&yNDYup=WQOa2%Pi8zPx9H|%EZF5-|j2*{6X=Dy3Ft5|1~l2fQey1 z&qQg4LAgHvR3`|Pr8}kkN=b1_&R0-{Qt@j||HLc?0<;LAIX9#HuHSf4d|7V#Y|)Dg zw1yZj=Zb6q>2pNNxRmOwHT9VpR4RPY&cz`#84FcpDS-yE-`SG>yTLd&puzhf_St9t z*SSod6P|^au7zzje6Fd9#X9)hK;VeAeGUVmQgE4CwGB)2GWh9&te$5?Ea( zUtjdTB!OX+MaihPse(dyE%i<*mU3+*t!Tb_qV`1iGnUQc5R?Q|F(7cB~BY4XbFgPEAsI- z-{L~-HFYl8C_F5PBVmoDxw(?Gbk|3%V|qyggLIRD6pxqugB=WGB0ii28yU&!@9%$%ez5BOb|f8CFa9Z02Te_rmGH6*N} z7|-I<0NokDI1CC7=CPR-)_K=K1gwbU6+DAUnKE8D>=gKFpVB+j`B>*c=|-X# zDjeP0%GgtyhllqvA?43bjr5w$gL7yXjRkjg3)p^2zWabP8~Od+2^Sb=-+;QBVrG>>$sdGFAO0zH}4UP5fmZqkr3r%@!DEA#FXJ`D$S<058qF%7o zq1VFKK>NvieJ21c??jq|<}qG=_TZR`2G8@@BiJB1H=W>D*;Ux zEuZYMPZ7v*zj@G_b%r!OtYY6DI&BJ+dt^yYTyPCjd z8g{8lrt;0V0<%1oD`nh@%dj)#{7yO!euDLfH@-nRI)jU~)#+bL^Y`<>{f`=|9Gx82 zo2NvdeWvv;dgIA3vw8mZNlWHGBm&O$mKMVj-!xwFXpVnfsENiHT}SlPBpkK^TSo?C zAwVu{glQCY#XPi2W}2uc1Myw-d8VB=NQjBug3YnHds;n`k-`e$=x?p958B;Ga5+p4 z%>mZqN*8ciaesm$XEHKt4+N@m&K^oJMgN2c2q^6F4->~3j0p(|LCP}A3!B9Ihw^d? zz5!FX&vbqB3uS#$DF|(K;Nl4PWCeEqBK54@w937M;L5D#h)*EL-&{{E86H*;-3%4K z@>&0SmnBg^EN~LuN-7vC(-F;wJj}|PO7F+V!EGw(5-*-M zhd>e&HgH{Q1c}>ZfreAfdAR$0&a6F1?%cwH>~UH9UGKu7pkFeT^pOsyJ}7adwfC&9 zu0BI>!i+;}-RB?Y(6iQ~A+F+)i9Bf#|()5B9N+&sLS zuUb$Hf7z*>*RM&0jPtp_8s%f)!DQvRfs*u~7bXdO_Q7hEtJDDyWyFE`Y^o>t#q8Q;1HB=7U^JxTsJL&@y4X6Uvnj>8pvvq0-* zJ(N=z2mt6AAdEk}5~~3s9q>B=F>-KixG?7M3~mkh-3}m6wwg6PRMOL%qhVpe#yrRm zfR7Tz_Km7vEaPkoIE>E>#CvBu#$K;wJdFLT-yr}QZURR2m9UCs8qSS`cVB@G4fhYt?-BX!rwiFY zQEzpCRIN0zlcV>#GPZidkrJ#QR;c5^2K@r|x5@Io_3k2Pi51@Q4!GA)+YKzfd-9jX z(ppDL`_UkAg=Ndh=x%}XLIY1PndiAsk2@I=NnUE zD$WA{2NJ&KM&1X!n8;UlIgAb*d4WALt<@C0*MCSF0A?EGP5Z&PVCwqq z;e6+AQNkvQabIU%uKwDZ8Z}^{S`>XV?zi3hM3X+v6!5SeC)S7$le;vRWePYCKjXKa zetukY-PjL7uk0`ZqMHMuJe4q>1Qy5$ahkkfe=r)@~QV^P8rF1i4(gGpkZ z+7!~NmJpEmAcu3gV4&U1ZR9dhg?u=_jjr?zL|8X?Z71M1w`3H(hOxFt_O(#nxg)&U^kg-{N$=xvZ{ft(b1Vb(k1L)-W4``F{P6x1qU9;>O7G7xbvE6!Y8VR)nc}94 zpcXEA{a_vw0~Z$;;NJfJmsBEdBNW%H&>iTLOxu0w`OT>DZ*3Zf*${KlkNctZz3HSD zqN5DAJhTk6k)j)j<1`#JGqUNmeV0B9UK~AP$Di>U(*MzlR8@~Es3=k?-p*}W?RAXv zNKDIc6(Jd%IR$F+mv@hp6(DgMxH4a(pG=q@xmDguZ)OUN^^u9B z+uo*WzGvsY#8i<+`Lkg1l{F!SQ%Q>2Ek!NqSP*Z26RhemIyQC_*dJsA4nOqu&CwW) z_ufeokhU+$DKD$48lhmYqQ-Bc?-82oXxKa{blBu!hVZsVGGb#9?Wf}KBv|e>c5%au zOZe(hjUFL33ki5o}rO`pqr1D!^tT#RfCV!^#jhq zF{|Y_MIA@ic86qXl#Waqw(VM5g$HN2E zVEs5Sv$`kgol`zog_+-ecno4B|-d%d=Lzs;b{^t;cVKTo9~6^^xnjqS5*29pc!uLfS&_q-|H{Y!K! zzG>BV3Pr5L2l(_;S5657{RDyi3n)l#>oH|3#+dAYf|t>e(}#as>@t8&8A07$vD^OP zxU66HmS;Z(yti&HC575%-^SJT*qif9rW`~yDrT*pLJb@~CDiE91bI62TDzD*Xuo|k z(V=WP?xo|0QNmDH>9T%{4X#xq;ysmb2z6KU@{P?LSGv&BIQ7zu_6R^~t7@q}zTmIM z#OtuUv!9F#W<|-P{Z}ZU(5TDHkoYqZ?nJYsHe- z?9DT(j8pnf_Nd&iVgdr^aqqf+{|}oIs6BHJn0yIcfKRw1&Hh*+>DA4EeD!-0n ziFM+u=`j`$c0y#kXUiO}S^|f0XOWrg1k0YQF#W$Bz5GJQ`EE}>vhr>Jf@`Jm_bS)} zv+){{JRJP@fD&n)e0-NLy)_|$9N1$}u1&w};`n)aRfP_(7yX|T%-iZYz^Zi`6N#M# zF9Zu-9E2wJVPF8BN1P^AHMN4WGTYX%Sf_$s3U>F%56>B*p{LId!x4Qe0}ub~NklOz zXNZLCw6Q9&X}QHKI5crE1sbummtRveX4!#@f&SDg`K+xr(8%|5^R>G_GNr={AP^m3 zzvaWu+Z4~|^G*e96MIc7zKRU|?Mb>ta@&{G$frWj_+g1+g-vhS90GxVLojTS)l_@3 z*xux88P5;t>FLDREGsEHxkib>5Yn3Mwz*zuzLng(NlbD#e+u03X#vTvdH-cke*w0t~#ra0Sx=U)L zif2^j9#)l=S?dMK%ae&QzD>@)rSritKb-XNAmAFr5$PEf6LTo0P9>km7%Ak_?GLZ5 zY|8lC4fP?woAzX;$tl#XgH^;l`?JS-3<7mE0@AKIj%Jvsdo0}i=~?>jGD?!G^4~e9EgQL!!mvK zWtOuaY4SVQ#IWk7A+=jH?M+_BZd2&=kNNEGTc7dXPf6cd%k?UYj2F>M{eA}FIOT7r zDxUt;X|^zcCP2VgjqNz}Fs@lk&FGV@F4t@;u>@goLJu zhb;@abKf?ovFNU0qCZXd7Hnv6Y@LDc3=z7)m-+T>6vPT`6-qZO3LU2o3J-i5$2L;5 z#_DqI<_&X(&9^7#@(?1s_GkOYp@P$s1?`GH1x($*Vvz?30fb9)R&mViBD|hz$euz^ z-C5z8@uQ9g&kp4oFO+TXg!zd5`kEs+rAwg9cRcarUXTghb7t+?M+r41b$9CJI0~K2p+e!A?e&YCq1M!`olI~>v9E84z#xr^mV3&r1(!_M{IZ=cYy_LF-5}Xyr(kO{+ zS*70=b9im@b}BouM0dU!xghq^Byq0k;$`U>;>>xvsE0jqGxRQX5YE18RJ2>qX?^94 zAqyykEH)|* z-*M`Nx=1t7cNJyhj*itP6JO8gnCTJ&@ny3^W4zloZXDY&fS3|R|Ov&GX8 zU889H3DaR$3MCJ7=r!A2*zFN4lw0dohdh~j;7Hn;P&Lx$p zM=rqKOK^Mb=sRBNecL?m9}}SAA5%iJqhc3JWRNEFLV_@b${g5Q7)6O{G&m%FxPZrI zEacq#hpk4;hg$@P4Ylj*WRD7DvPQro(7tU*_apk=2J0TYzotnY2fFVLOHUhCo8B04 zA)P*$=FKqNxjC|#PW8^s^_bC~sF%6bh(QAn#BS__u;bL%OH!gGKBlO<^} zjwMv)Zd^ur9myTaurI|7`yDo(>I2s9GeRHCNv+JyhYFs@u79R!*7KZFE4UYhlhMR3n{I=+{y`SGi4HH`VVd z-M9h?ck~pp)V+{4VrtyPuNX;5RdF(!Thoje<0t2}-hNJm2_eo+$MJ0+k zHXeIA#9S4a%q6c`a(1D!Lyohsmq{D^tM#viON^f6?+QwRrE@zU+{1Q}kjN}3dd6j0 zu+&rD*;?6Wo%Sn_`=2M1;sHavGzrwYh#PA4Y|%?slnMK+W{@Xt$OFl-__iv)_EvNB z2MlyWUpPgDDSGT%n3BNKUd}OM%P=I$8g)W}v1!_`XszmRr{nR(>TmAh2Ob@@>hk`F zIQ<=UZI!H`p9G<{Ltla?<5m5?-NfKbw zsH(G#yp97$#&cMqM~QagT;-ho)9u(>EojTq?|(e2+v~J++~g^&IzNz?%~77UA0=8o z`5Yj|v{|G9SvfFcDT!=w>WFSYj#2Da>RIoge~>bN7kR$sESAykTV73j;;!cPK5gDb zB;cExI-5?BCD1*XwsW*aF6>ITjDV2ibFUA!(TkkFXK-9_xvJa`^n#Y+?j1h{8+70P z_#6HFM)M{xd06bl7XE&z*qOg)^SQBnX~~e+Nvp`oj~UB>3EoHV@JU~#kF%;rYUayxHqNT9{l!;dRqb3Q61XU>M->A-odgMs&v*))TGE(U7-}Z z9?7r+`UoUwPn^(r9eu0~Vc=35KQ(kY77xH`vodV=NxfJ|Ei}-DToJea`{@n69HR5` zmZK;4C9eL2hNjWMfM!U%9$HYCD-FbAFcem=ld&gdgY0SN#V;@U=8+>mcuI!<`|=9F z4Au`J_#QPW)F?Gd%|BEGI4AtAl!b~vl(%1A6CwRX{vS&!f)&8JF-({~njy$H(!0er z9JAV-lH&KS!Ndshy@ah}0mqoG$Mk!}6U#89!jov~s?fgi`NvNyuMF>{)XM?;-R!R? zVGf4{VPVW9gr_LBBGe@~)`}SjULr0301kCPb(!JW2+~XUDpJ z4RZ!O;;`j%!TTJ3hGSx|H=o@el6pnjC6a&fwU=+@0(j4vVZDJ5Q8cAqmW8MEw4@uj z*f|iBma+!$g9OHP2hB(smG2{8{qJ-=fKu#9(d0rsB)S3ph5gy_g4WbYt@)Zf6U@QM z;jvzCvh=T{#h>!qRph^?j(82ATqjjmFvr9*7S%d!4fPc4n z>ZKbog|X`e9ec(aG4#r&&f$VLxEbN&ur;=TrXN|${0UQuBN?{Z_4KLazkqtb$HY7E znfRTQoKBM~B{DxW#{m}jF{OxENo#N{@DvtcnPD{*yG@=w7DN3x8s{b03StyvHOEHUY8lBI@QCH7S ztdLiI76pZG9%57t1t>Z%$`g<%6n zCuyJ{cj18+a!zy}h>~WyRB#oQT)XW{Midw&>cU+Voy<8AX7^H>;o3hF>8dOG`~b)2 z0w6av$Id0^hW$OV4hyzhX8J4JF5rNLUB8>Sk_n8!ZX+k#C>z+RfaA#!JKx$&r^&XZ zMdX|fb0p|-G=N=Gt@m8@5jvQqP`8wFjHcHVj8@Z<&Q%5=UiS1d0?Y}}_g(FpD>Idp zpc~y)I=p{bO|2b(^y&&B?N_CL=;A1?($nz9g6Zbkg!%JHZQUObC%_xR`d2c%j1?^+~shH$$5}W4c7s%#|E5s?< zPw7R8|4h^X1#ipE7^-d(oZnNu{}QEREcJvb+`U} z)s^FAX)zb&-@Uq&Bki9R47CceFfa_u$3R=h8s1(cRErqnQV?Ode5$x7hgYZ2yC(TRn;0G$ zPvW~TA>^@A9=IQ0Hf=^_Ba|IGJ6XW)xrsWN2rga!`u(K8d}IW}x4vp-X25jbmYF@$T=lxcIm1E_6td86tqBi%i#mQwQBoln8iu{Cgk zH2KCu%d;s2Be~q#SYfPrUl21laag~0tpeekCqLQGd=ZY!T!xIU^M#(1L1~&12%_aG z^W1ydFaf{|a4ekvwJhvUo%G|es(O}DNk1-RXX1~+Y6C2ylQaC8!a`#9K_m>4rf20Y zN5N+e3rS!qZnjI0VNc36hAS&+vh-AZfXu;VN}b>~(3lz2!OG!`;Fzau@{CA9J_{_@ zYY)=!Zd6${I@Y2J#Lp2gXg||@`t3$T>d ztF2ithViZU!FbJcQKsPE*WO(!r;A6Dg2`$UjA@fWH`$F`h6^4wES{*sQNHAbvu2>X&YUdLOtQ<; zl4be3Wj`kZ7p+ekTh1;^wf=i}?~04xIlIKX)2Mpp1?3X4?Yo9+X)2fr-}CcrKz$h1 z1ozo(i;QHzYT;^&k!nir%gqxI z93G-WkEXfFdUYCC#N^#jwB`sPPLYjEUS;I@-p!DcN^By%=2h~>+J=%e{}vCi)by%h zd0k_5wjxJbhA+BmOteepN9OJz)mKXJP$Q?aNbu3W7onRj`UGCVZ$7AkW+&72=PPZijqS2c0Kud8ygEMn6B~9F!WYIM{GP z&871lx={euW$)O1w)5K5;VhS~M8_VdVaVKcc`kyIN?P5qGYX$q=$MoKFX(a{i|DoM zTdJOZWhO{^9zG}^yq0b{lSZ^wqTEH2u&?SG)~RPHPgxo566?x4#ve%C#5G&}C-G1& zidjWD%fwpU6p-bW4Eq!D4Y)2bu1Vag;8c*EELeP84FA}j>U2-x;r>a@%yOeBLN^G;#AwzYwZ_hc4eQE|) zL+RL9*_3JZd!R>rIMgCTC0@r9dxC%`y;he(VSOVkFG%?~vIt0p_;Vac$;dG{WyW=Q zS6{rEN}A1jD|A;$iD}#apaxjdyPA*L1;?DAS~LpzDzaTKlT`M~2?Zx6if3PghFqp8 zEGa`fhypvCBHrwkFK)osM_r!4>`s>+dmN{Fx->lEEY_bK+J;y2JtIgMPw)I}SP2gO zudoIVImWxN+jdn<>~D;r)l^EQ61Gnr(?5yIf$^%>2AY4eik$j1I`l!GGqEy3U1YL{ znHaIZ*H|OUVbp7JhvLZR$P0A%o{xB|&MDI^EN-|X|10j_zENM4xg-^ycU{+-9;kR;1h_-5$-vG3YPWm9)>%6=~ z%dH;XFmIt#X%uM%wlYp=6K~ae0uoCnxf9iN_sb${wCv`Ab>n`II^TNeHll!wayJE; zOEu$Cp^mJFS#`3k2H!rmfBYxKTeASTsy(F;q*u{1PbO=BKBi2TFf1imH>++SH>{*A z1?>1)ccwwEhgdf!e5O*ZheU@y)yBQuosjqzC>L1Gzns8dwT#q=+!&!+-=>MBloePf8K?Ava1+=h0z%}s7r*BR6lboX?!vhb?`ar6GYWC-e@l0+A#B{Zul9KYc; zqdgU3ri`#JwQ)5C)%@(iQlk0WvyTO|`aQ(KSVb{3^dVQ_g04JoC1V4UA&S`7uE#vSr1& zMLPE2Yjp$N25WTSDUi3Y_U`9DOXbzew&q<1cMj`&Or$lVP47!&K1um0wOg_kl3&i4 zwwg<1=@qFLW(+*c{7egBHVpSj(9kNrVbds4tJ5gi;g6XBS`pTrsCXsje)yb9&`nze zGIXxg9)rqG=PPLpm*xgg+(FMYMH$3iIe^L7|I$@M$bmpcEZKI0tZUpI6+M)$wQ%;v zGtJ<39BXD=3lHl^&8IbP9x;NA;E`oEJt1hpWoY@VRy%i8j<_JFJ%swu{6W^RdGglH zO~C!IL57UGkq}-$H@yg8v>3|DO1aa@wuf8sdzNq8J0SXCX2R$zBuU%6T11<~C!kl29Y^ocC# z3f=x?4C*r#EB9dPts)4oc&_zXd_}XV%OAXdD>{O9Nn;*W2vI0A)2w6v~hE@ zUVU!tLv5}3KsxaOkXfO(Clm(W@_TC;Y^J23Z5$}aOd3}nw%-0vo0sR-IF2_*EFl;I zFc_;`A=~_$!Ky||Ku1@vem<#1Ig+2IkbkY%=Q$>3!`WnXgT;5r(SbZwbEWi~k`fa& z+e8I9%H{`BhBuK?qYhhjy0cARv>w3i$!bvL+-+YU>2S`tKFFAWya*jYTb!m(r6%J3^kr!SU-b`;q`!v?{5J+B1BHPX+sHeU`AgHcu9pqSW=8?}Eh z^I3+wAQiHokTP-f0q{)nKpG@fjk9lJUVqYpzqsoM=uO~7AiGXQP{iya`+L+_Qiz4Q z`kc$6c!K`)qTl6SEB_weoB;MXSaX#PUr2f8QOX%lrWasR6lQazu|5Ue<85mJl!w_T z1f#oEZ^iB^$qPS{kxp(Np#1lK;EQ)TAQKHV7^K6s-3apshRAmE>jz8y20qQzIBr*T zH1zA}PBpv&Cx$Vm$kfTnz7)(JStk&lf>@hOm(AG}a@>O&SDNMlUNZ{bZAEp3XF70E zg?ij;ZK8AOSGx!O+ZHJafMj9`7lH<`=0A(A8H>;heSR$-TgzA@a7-5h0&Lf0&&4o` z(V>~l_pDtGMcY{~o&1SHJDauv3$K8MRSn?G4bzc=h76Frba>(Jw|Cp)UNSQ^15>NM zDPJGav}OHQdt#UE88{z1O%7!?%kj0xIK>)bdM0B}&bn#5CA}6F7Q;$9 z29%CfHCw5&*cKkl@>398fY)}}d993I`GnVLkL~fg`{+`tztaQ4~@c#lmbdmsQyl;GLZ6El$Dxw&7*3BFh z8)e_04a_yT`CEba)0-`0SfEt}c8GVc48&1APb~^>GO8`@g}LVcO;CLfEo1af-@9K( zBX7eiCL+~z(2uKUpJ;W-UbnEfs;&>mAGx=tqM(;E7IIIwLcgRl<5JC5Q#140Q!0(# znW)dUxRt}5%afB(l4bJRTz(V8c<<%o#0er}re?=b+382)9Mb;GvESI(_fq(jsdR#9 zEDoCw-%h0O1eX?c>GZl`{c9{;jq&PDi!kqUz#ns$OWvmNXVp9#z)HIn=-Y?KqYG?Z z-PZ+E%I?WGupcH(^uI$$w2IY4wtD!x0%$hD4CtnkRw)T_ej2D?SEyj~g~iJU`5o(7 zs#s<_k=)4_@28xlL~1O%)QNWtwrM=t!PCdXrj9?sVk)ty1EtBo zrboY0-XnlS0NBu~vQZe$@5YEP>1z^Y^U!ErrCx7}oq24T!!!(xs^N+y z-`A4OrhKGey07bD8arEi=oUIw0|~XTM(j{078!8pKc+@Zd2!#Tdih##3)f7}Kz!i4 z(oE0;9U_p$x(~Ig^FyK#fr=d3*XoC@GYJQL;g5kRWM{_oOt{8NUf#{auI2(S6deE0 zsEaq3Y_(MD>m!Vi_FAgPMbpbiERM00lR~Un3?+pldU|TvU77c{#q~eI79M9E-N2YMaf%vK5*K#zxhT?)}tC(6G+0 z82RZNxT4)Fu@(rWE#BU-Q$4W~SB2BzxGz4} zRe5@c<~&wy_J6Lds?3SAvi&=m0gG9xewJCE1xWYIi?jU!8x9j)?I|Xf7_N18SCbLC zO!v`9n}LUm+rWNU%LcQurWl$JQKqsLR_>opJ$`NoMa-C5F7nDHB6En|!4kt$2AiKs zS2-BGm)cNKf89utI6@Kpef4vR=GyRkzKIQZbc37n$+pm$F2C(mTh$@AfLrZ^l6qDt zYZ)`snV`ky=m$I2^3R&?OgY&@eijs&35+~m`#60^si^`8#`!P#Z$)T?vUI-lLhgzc zurZXt9eTmVBP38Oy+D(R>;_)`SI!?++`TKw|N6t)L`6fh5jsXy2&g%R`5EKN z57x~#&#MlpU-p3Zl7+tH_L!Vho#|^@=L#OI^owNP#HN00J=_*!IJ;Q!Ku*2?AV05F znR_LVR^PQNPHY(3*JEAnC@46YGG-}6b+&Mj6?PDfR{#^as3q{+W(If&EwaZ&Esc5B|GYy&OtHj z@BM?ZthIENa@a5WNK|xnbJ#@=iT+$=v(Q)qm=zE&FazCVJ4L5U)Yl0--BMlo-d5qN#r%{U#=QfaB z&nglV;|oN|dd6OSn@Xpkgw#`0DEXyjSF==gjkC+9qiRe{|0adbw8ONLd8Ep_lMf%z zp+)39I#xO!_4{BX>R>_W@!3&!)FBPrl4vVXPUPo$gs)o(Qyvj6<%|XP;%0FQTlmqs|BuxskKAP>nkKM}#?(Q17S;E3Yl@S50js604> zrEUv($_3ZkX28uGPC}d>B26#mf~|&KIIcY&u z&{hLdJMD&&cU#F{ZA#P6VtDXN5a<{ACS;PGgk1Sm3~SnSsGTWAjO49lIFx=255?by z+`Vb8@LZhrh1SqcJj`0F!97gDxum9g>xo<}45dQabmX}Ti^mdM&vu4tdd4dh5+8Gy z_UAeu=8n!zWYb*Oy^mqbgH;uD2g8|DWH!V+%XLwS;fKke72Gb!wdnQg_aZW7Kn-t7 z6g*MwD4e>|QVomEg6B1dRE|}Sda?t}@ni6uDiQ*a0JNq|0TDw~SkpaJ5foPv)S)s* z@G6bZV`#4kC|;XHh{tWvEVky-kGmJjN662;7;sVj)3dKa4wcGxzwITG+H249BF`Pb z%KpDbe?kIrZm^An8(AI=v-seW=`NGm-ko#G%FIkP5;8%>-djhMmW<7*M6DlZpl^py z2GOH*xeOYY_gK$LrO{6|6|nY)rmTy#IRL!20r@#wqPh9vVO0ZNSb-d?$7vYX#H8~f z<=`cvyxLjUW%?~QF^unG(e&h4&c?;?L#R;c;d-~L=p$ulDIWk9eXGrTO4AbozAZPs z2R17%E$P77>{MRbtmuNm)bQMT^)QFnnjVV{s4Bfk z@1P((fPf-|BuJ4@J_#sN1QZaE5@`~86Hr8v8X@~C2yz5=(xSxoh;TaRH@jzFI+n49U$Df{s!M9HTq9=-cJ-g#Y@gAT= zwzK(JQ;Tr*OIlx*D$!o+a3IIoo`2(K{AX3--KDW6yAD3&_kb1*Y3uslnspwcafMtQErY zTisneVqP!znv5Q1T`hQRM6nLvQcqaBm}#M!ZL=qn)gDER6M*pB*BFBGhRyk$<4fLB z!!uzlTXy~A*5E{(@)a^)Gf(fE(9Dsm+{F;VJUl4fQu_+D51Kj}&>4`qv#AB^Dj|dv z$7E8CH0?I>2v4?rK>msFF}P@#!i>vB9xy0j@KS01dV2}#ITZc$Zaop4m(&ZXzmQg) zZ)L^%(6FV}{rUXv3<^vh81v1Puf&BqX9sF1;K1E#Y;+|3EZy0VQA}CcvqTfDjJW;K ze6ZVw<8^%ckjxu|^#j72KUpHCM{Hb=pa;avk3a#Y3`T8E!!r2p_kpQ!{d)p?~ z$;w2gB)eJa^3}JMUbWmZH}&}9=dEdf8J!=4FDDR~=+>Nk-8;6l|cbObxNu)(&rT*I4Hc zChDU5pmmz1CzdP`7P_;9f-PfTAW&EJgm@Z@!;LJG7mx3BzKU#p)UFgdF=#H=@{!$3 zb)?yGQdV23*dZql>txZyzpn>K`44RO=%#?FvH}Qk;uN$m5EdWclHt~I;THj-jtu@P zy^1*3(cgMcui@p~hsHn_f=pm%(9d<9sWf^0YNuH=lW(~q{H;Q>2#?OTnd{A6sK=I|EbJE07+&K={A)e0wm}rm8VraUns#f} z(T~u3_A#gt;W+tnkkzg~6g&Q+=&K}j@o+PQt%~mS_t1x`Y?mY{6VSs_sSD_o=1dbH z&$~CKga_3X45{`k0-b~go2dJfz6t{@L1ymSDf=y?ecN*Y5>Iu(tpfZw^nyvSVx*|K zOY5&ABFOx`;tul>{}Z=E1{M3NwAm0ELs+`O7-Z0c+L^ zsy5g2!Umy;WjPKp{VHLteTBZ-#Nrifq|%l`aGm19)Q6}27Zz~dK0LmG-=8;x_Ikes zQXRc(D1f#tAw~vWwG%h1_*kWdW>%z+!)zZX+Z@s|T>zrlwbx5u<(iN8Pt?GdPf~Js<{&;&sZdXtE5t>YGCgZ4oakxz zm-BemK(cxD`y0V3mpvLA-q@3-yD&<7TiXdvT*prxP?jfvfIcy0QxclD?k{yeE0O%$ z&Z+!EKNK_Ss6Xkk-p>7M-v0%!+ZDO=TvJ3-Gw!b@;&%ZMKHQHYP`BS14D zbNz!B)QKi4KX`xFH|s2J7LMryM$yv1R1Ob$ok8du}`4d8~?k$Jvbdbp(wbu zJJa@DBV_CqO={WZ#D845Ok0-hK|{oDYevLhL0rzb*zur1I` zWNtfxnVwJL@w~4cAfcQRWDG->7&%-96(zAs7Ta*6ODC=<{;YDqRf5NoEnSc^4r_nq zwnkd&LpARHE$_WtyNgT7Om%yr#l)euXDQZ}^ie9tXHY;c)V)uKJTL_A8VD@`sso>4 z5&X+Kc|(X2n@1i@ahfx8=n{2jMau9GaXv8TczUsza@q3t=8>*Eys(uC~ONnlSw&Kzp(6XMW z*$Z-FXXZzpq?NZQkcuomN}2#wJZoYd+lj-sz8h|~Q& zj-AM=+Zn*p-4DGmQ0yZ+D$R*{?Z*bN@-V~jc9X=N=>8a0au(Oz0CMVm=wAQ4$E*xq zZX}RJ8c8D}yWL0|9SLy&*hAu7U`m&#wo|nv!`JOa@%w6Na)qLDdDbaRF)L{s*GPw(Qi zdfb`u93OwM|6CTK81G}%qyhj8;Kb_5KVYV^yg(emyW1DMfMK%(nicgTDl(pn$}Q?I zk7F>(=ebYRix%Ne)ymx5=q^B15*A|_^{G497Z13DP`LZr$aA(MWZxK5_pXywV4%S{ z%-WvrQOqsNa~ep%!60rocG8Oj)pU>I{a>o$nMEsZmGASN5mdd|6YHH1%ZL%B`my zxCzO;RtmD>x2ePVcWCqaR;Q&`o$BWYn=jDBynkQ^5LGsXlT=a%n@@WY- zZTaV;j|f7TK!lcvPQ?L0?G9%V^5Nunz%KKj>VF#OUvJ@QF)$=wi@L=(G7uzG*tg0> z56Lq*7RO;Ef?mYwdWBjzsh0`0M-EW%o>WcvE->0q(w?g@+Sk{*bNgHGt)c@H$NO9RyA-*jaKP=VCjZjKvuu zWnI7Et&BXBd2cybXs$%%bU}D1#OCTCN)d^SRjap!uQ*vQp61Iag~ptY{nSH$5lqZi z=190B7k8($Mh^y) zz+rfW%k$BX_G(DuiMfkvE7W75J9WIzPx{Nx=s+l`ROerIou$3LFPP3t*e3E&~An14aH2(OTX8+ z=%sGVJiqjfQ6mrt$eOghkH_<&+pBZPq{JStHnJ5Hcx~bNfGu~ypsQR?w3eQrO4RJ?1#5wj|Xg z+iZZsr8aE+2=yPte83RD`51Wq5&wvYagZm8lFXu|Y|1w;{x1^Y4k`zth#`xkA(1-FB%bj)wXsJ1jB~MdXDZMmI06 z%P}%t=&DT({Bx+u!w!dhpl9e>T_GmTA6K<~d-v~dh2Ch$RvLjN;wvX{!aT4K%nNhg z$htrJobJKomDvjIqkdua)p%YI&!B(Un)jqB0Q(1c^3;~#-SkA5Ekyt-xLwu6KKyoN zz5YgLLwW0w^doG5yJDYj_TY7P{t1k-QrCzGrDEyc&v==>&y!Y*4D{gBC%$Dfw)8EN zBuQZX@)}^<-0f)@Gvm%AUr?=64p*TJbP73vc_g553CP-`hnZ)AS2p#nCEJ>|v2wqT z_Y~R=7`Am_&j`V-@NMZ)l@F@hJ95-+8yT=oB?s0GFap-T=1wZ8t(5bUrXGFlx)Yyx zZxUO`HH%S-E7jFS&$xLAX%TqJmS{S}%8VFrZ(e?>A<**Z_5AouB{NR1%3G*}_1kwQ z7WRcmocx*AM|&0U+r2aWd%sHmb{d_A+xqXh{L#}5JuyK(=4MIrM4o-Ud9!>S-e&^N*;j;|5Q>M2)b!rQ$ug)>h z)nCogYd1~vAg~3lM`ms(CKubkc~W+df+YWJgTDb3!v1Q+mG$36`h@5XiVL`JGT29) zT6tl_gI_t9xnx$*foEW3Wue$`au{4h#}Y)&EE$TAowSgAZmy!ZvC<-VI|2eE3fAYN zjvt4BBM592ioD-o)NNzc()`RY%YSxEha&=YqeE<$zmZXcW7lSzl}IUSx}BU{YQ0!F z_sXvU_wbU-149qr(PW+xa<>uKni^Z}`?^Pj2zpoz!v?EPLwUpkrRK;@n?qI&bLxAA z15tXB{CmGXa3a>18Eq!d1~49OsQ?ypq||U{5z(6Mbxds_wy_kdA3~kU24IT3%Qdy| z7r1P#E|s56ZghbF|BJL7#+xolDcxi?7BCSwwKHmu&!x#f`k)n)hPq8bI*Q7U($RQ_ zw160xz54tg8yDHjAhl@SKyxIh0~m+>hN&Xf$JyTVo(qUI-aGN{FMD;(P=gNTKf`|x z9b#XtF8$(lCg2#YfP?ElkQB(dGXGNkB6DzN|JXgik>U$6w2Vne^f*{C)2_%UmJ@@9 z_qEo>(G32BJ3puc=I%{_{JuZUjzb-rcA2PHe`nZ##1$Np2J;}+T{T0WIy=J-9{ixN zl;mT@;S1rtN>l>?;G+F|b3xdKhH(p*oIQPT&;GIF>VH0bht~g}`Cl3R zUzJAB9ps!Hk#-kthi?Dw(g_{(RQyp?xfhO%R--p|FEa9Nk!}n z;e&AZHqVp~WtO4(Uak~vGJ8LiH^jd=9qoAB3vmuxJGG5zp^0quDKlfTN8DC$RC5ru z#DC+{WoqI6U*VE&3#Te9jc(Yg2-7a+h^$e-E84^zl=@v5!(ZcQ8RN2_zzD!>h}ObC zZ#vMlJwP=DG_bb}V2qLBq1_Yy46CCPPs3t&1f;mC`!~M38PoiM7TqGtGKW9sN!wpn cm)@iv-YS9#*0k1M+iipH4WsKNn$8jb10)y?^#A|> literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/desktop.png b/app/assets/v2/images/chat/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..93d00bae3b26bed251db4d27e9782ec16f574e3a GIT binary patch literal 2983 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 Kz$;-lqy7PA9iwvq literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/windows.png b/app/assets/v2/images/chat/windows.png new file mode 100644 index 0000000000000000000000000000000000000000..080e74cc0e83e742ea76985d5f26a2ab32476210 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{!3Opi<85p>QL70(Y)*K0-AY*Zm zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#C{Gv1kP61$3B9}yf;=q~%^P^<@k(4&3)|Ev z*b`8%?#L2+~C_qjw~Q|F?hQAxvX. +{% endcomment %} +{% load i18n static %} + + + {% include 'shared/head.html' %} + + + + + + + {% include 'shared/tag_manager_2.html' %} +

    + {% include 'shared/top_nav.html' with class='d-md-flex' %} + {% include 'home/nav.html' %} +
    + +
    + {% blocktrans %} +

    + Why Gitcoin Chat +

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    + {% endblocktrans %} +
    +
    +

    + +

    +

    Feature 1

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +
    +

    + +

    +

    Feature 2

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +
    +

    + +

    +

    Feature 3

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +

    +
    +
    +
    +
    +
    + {% blocktrans %} +

    + Join us +

    +

    + Available on all platform. Chat anytime, anywhere! +

    + {% endblocktrans %} + +
    +
    + + {% include 'shared/footer.html' %} + {% include 'shared/analytics.html' %} + {% include 'shared/footer_scripts.html' %} + + + diff --git a/app/retail/views.py b/app/retail/views.py index d4d8d18f81f..18e04f814e3 100644 --- a/app/retail/views.py +++ b/app/retail/views.py @@ -830,6 +830,9 @@ def about(request): } return TemplateResponse(request, 'about.html', context) +def chat(request): + """Render chat landing page response.""" + return TemplateResponse(request, 'chat.html') def mission(request): """Render the Mission response.""" From 0e8ae4233845d27aeb798d0322a45f2f9a7c9077 Mon Sep 17 00:00:00 2001 From: Owocki Date: Fri, 13 Dec 2019 08:30:24 -0700 Subject: [PATCH 105/152] copy and fixes small issues --- app/app/urls.py | 6 +-- app/assets/v2/css/chat.css | 4 ++ app/assets/v2/images/chat/feature_1.png | Bin 0 -> 67784 bytes app/assets/v2/images/chat/feature_2.png | Bin 0 -> 27342 bytes app/assets/v2/images/chat/feature_3.png | Bin 0 -> 39299 bytes .../images/chat/placeholder_feature_image.png | Bin 2271 -> 0 bytes app/retail/templates/chat.html | 35 +++++++++--------- 7 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 app/assets/v2/images/chat/feature_1.png create mode 100644 app/assets/v2/images/chat/feature_2.png create mode 100644 app/assets/v2/images/chat/feature_3.png delete mode 100644 app/assets/v2/images/chat/placeholder_feature_image.png diff --git a/app/app/urls.py b/app/app/urls.py index 09f831cc2b5..6a769ae9a8a 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -143,8 +143,9 @@ url(r'^api/v0.1/choose_persona/', dashboard.views.choose_persona, name='choose_persona'), # chat - url(r'^chat/', chat.views.embed, name='chat'), - url(r'^chat', chat.views.embed, name='chat2'), + url(r'^chat/web', chat.views.embed, name='web_chat'), + url(r'^chat/web/', chat.views.embed, name='web_chat2'), + re_path(r'^chat/?', retail.views.chat, name='chat'), # Health check endpoint re_path(r'^health/', include('health_check.urls')), re_path(r'^lbcheck/?', healthcheck.views.lbcheck, name='lbcheck'), @@ -352,7 +353,6 @@ re_path(r'^pricing/$', retail.views.pricing, name='pricing'), re_path(r'^subscribe/$', retail.views.subscribe, name='subscribe'), re_path(r'^about/?', retail.views.about, name='about'), - re_path(r'^chat/?', retail.views.chat, name='chat_page'), re_path(r'^mission/?', retail.views.mission, name='mission'), re_path(r'^jobs/?', retail.views.jobs, name='jobs'), re_path(r'^vision/?', retail.views.vision, name='vision'), diff --git a/app/assets/v2/css/chat.css b/app/assets/v2/css/chat.css index 867d0c5b7df..495f6930f94 100644 --- a/app/assets/v2/css/chat.css +++ b/app/assets/v2/css/chat.css @@ -36,4 +36,8 @@ .open-app { background-color: #0D001A; +} + +img.feature{ + border-radius: 80px; } \ No newline at end of file diff --git a/app/assets/v2/images/chat/feature_1.png b/app/assets/v2/images/chat/feature_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f976069fdf60b74330fac136b3aaed92ffb85d6b GIT binary patch literal 67784 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

    S$c%*MLvTsulspDT_72OSxeEx3nZK%+tU_ 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 KJzJ<|jr~8@y;idT literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/feature_2.png b/app/assets/v2/images/chat/feature_2.png new file mode 100644 index 0000000000000000000000000000000000000000..205266f29a90e2ce104a80599b2b2ee80b3b7a78 GIT binary patch literal 27342 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 JT*@@ye*hln<`Mt^ literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/feature_3.png b/app/assets/v2/images/chat/feature_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9117e4e6e3b12b11d582766c8cf022c447376b03 GIT binary patch literal 39299 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
  • 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 literal 0 HcmV?d00001 diff --git a/app/assets/v2/images/chat/placeholder_feature_image.png b/app/assets/v2/images/chat/placeholder_feature_image.png deleted file mode 100644 index 0cf92bd066c2682acbc695783e0d501d3a968413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2271 zcmV<52q5=~P) z(_9qCPlFw+e!&$GzgTdbv8=$d0&oTJtN>VnumWKPmKA_2u&$tG#^LRYaRu^xKyW&( zo)d2{4QYDQB+X6o|IO6&RUrBGoOAEZy{S<}==FMw^?Kc2SXgNBL))^frQg4QFUozs zEvmQK6F%5k4TB{BT31 z7h~ZxCeh}EZ=agY<_Q&)!U^L=5*B33bV(v`SfK7;FgSeu`gNZQL?MKcX!7{+<1LOR z>ts&4Neiia4mo9Yr~nu(jEM5|>C zTZEAo(6eXH-g9$t?tf&NVQ~&_Zf^GHHPAU1VN?n_roW@cAbsYRqB2iOS65dpmgO@+ zmMoDk(%E(m{{ye35;gWz##8 z8b-;oM<6#iMeSuVtdP1eki{IbkS0}OAd7jVElp~|Ko)aJQ<_wSQLUj40b^llwpf}Y zN=Ra1q@RU*Z+ircMovN>3`ER2i|sUBRL zKv8gqXyn+@jLa;I3?vd{DIzU(>}F!78b(f0;LQPnBD1@^yd3)&#ui3$pqz_=F8^X9 zMKIT&t8quTW2YpkTOdpEkz=UNdW=OZVbq|OO`t5a2nC^Ip_Ai7kOX;H?C z_}~_SO2WZnds2%jR2b=ZAw-wTB2nhalP6nYuZ0T3d2E|N)maaF@_{gFelF%ggSM=R z9DMSDF!g#J(FM40rg<=2@IV;OUu^<_TwykY#qXFfXJ=<(luZE8eG_}EJQ)*4*6=3) ze5n4oe~$yN;}ixEWXy?sVWc9)xw;^TIN@(C-3t>|5d$Fj-SDTRHv~X9_inhO)zWn0 zuHYX8zyxk@Z=cHuwi{uBO(y_?c#e1}sZ9Vxz;(<&VfX>+7ZAy4G-}J%i!ew@AQJAt zbAw6^1uxJ=3SSEaFVLl4uiF-ScY!WE*4VPV>K6bFY$$+4+kj;#6nJ>`kw&MpjN9P!T^0nqtSN=1GM36)VGGiVWR68gX$oQK3jvqz##xM zxVyXSyOZ%RE-vIsYc>He8E1KU`GwbUhqMGD;ez*6ww8MEg#d_v>lZhuSpEk9M9`Ig zTw$b`Apj!q9C3wF*T(4*0O54K>nHg~t4|4laPHl>7lwQBP6&Vy{BDe0!te6(@&{IP z0Dh!*x7lny_a2X(K*i1LPXxd?W0@y-#$AU1@WEq^V?kt07q84L!8!RJCRbk3vKa)I+UfhyDI(dpITlcCd0&{_hV zX%54l4;ALuuU{P$zm>*WSy}0Xy$~vl6u%s0LJb4uC#vByapog8u@4YsDv3i8{c#h8 zL6oT`5?weQIg?(GoLh}3Q#l-((%T;?45Cc6m=;}xsjD|glp#!Zs{+z8+MD*Ksluoz zvrC}VaCF(%d0&k*LGN#=IpJR2cRFv>UQmb){0{|iIpJfgok6sPkzzqk2!c_1~F3U~TzoDala;|{5*9LO=`W4T5#i7gCLQ#pv6iacVcBo9ta(m%6JpokoD zD%znLn0eXN+uPec!m1BN#8Jm?CT5N>!uk2R&ACvDV4FY@kaA*emQ>`CNEqSj>Z--R z#Ai%^Gat*cR$sn+nJ6nHUI|=&0Sq0OkF;)+$|9t)biAC-hnADMs1{L&QXp|k^20UF z9@jMQ2^fQtWsg!KRbd23V-9J{BBU;i0BQ0k3t5Crgb^T3eq<$!keM(7OS8q&d?YXz zWPC_ktZ5avp+AE%M*3;^k2ofD?q!X`{Vea&XgWuc`4!pZ4^X3`4uPz2_i@&;2y?lF zpL9j@_=QaD#tek?IplqtsJlN7nWv;6Jj%Tz#W02vlA+FL+2>K`1DYdq7e>IKWn#M0 z)jzMO;wKkjJka!xM_y57?02A?QPJiD-`yY(MQ%~WPwv8as6HEsHZ}o24)2%UX0vI; zQgX%!O(vCybx7v$GA} z`5Qdwwr+aQv6?M{% trans "Chat with the community" %}
  • {% blocktrans %} - Meet fellow developers, designers, futurists and more. Collaborate and buidl awesome projects together. + Meet fellow developers, designers, futurists and more. Collaborate and BUIDL awesome projects together. {% endblocktrans %}

    15,273 people online @@ -57,38 +57,38 @@

    {% blocktrans %}

    - Why Gitcoin Chat + Meet the Community

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Gitcoin Chat is where the developers, designers, funders of the Gitcoin community hang out + BUIDL the future.

    {% endblocktrans %}

    - +

    -

    Feature 1

    +

    Connected with Gitcoin

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Automatically import your Gitcion profile to the chat system.

    - +

    -

    Feature 2

    +

    Public Channels

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Meet new people, engage in interesting discussions, and expand your horizons with our community in public channels.

    - +

    -

    Feature 3

    +

    DM with Funders

    - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Got a bounty or a grant you're working on? The private messgae feature is a great way to keep in touch about your work!

    @@ -96,18 +96,19 @@

    Feature 3

    {% blocktrans %} -

    +

    Join us +

    - Available on all platform. Chat anytime, anywhere! + Available on all platforms. Chat anytime, anywhere!

    {% endblocktrans %}
    From 0320c0be15959b862d94131dbd011548d53f14ca Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Fri, 20 Dec 2019 16:44:23 -0400 Subject: [PATCH 106/152] WIP, adding funder and hunter into the same chat channel on bounty work start, only applys to bounties that are tied to an event --- app/app/settings.py | 6 +- app/app/urls.py | 2 +- app/chat/tasks.py | 49 ++++++++++----- app/{retail => chat}/templates/chat.html | 0 app/chat/utils.py | 0 app/chat/views.py | 23 ++++--- app/dashboard/models.py | 2 +- app/dashboard/views.py | 77 ++++++++++++++++++++++++ app/retail/views.py | 3 - 9 files changed, 129 insertions(+), 33 deletions(-) rename app/{retail => chat}/templates/chat.html (100%) create mode 100644 app/chat/utils.py diff --git a/app/app/settings.py b/app/app/settings.py index 283d045c0e0..158b176c57a 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -544,10 +544,10 @@ GITHUB_APP_NAME = env('GITHUB_APP_NAME', default='gitcoin-local') # Chat -CHAT_URL = env('CHAT_URL', default='0x.ngrok.io') # location of where mattermost is hosted -CHAT_PORT = env('CHAT_PORT', default='443') # port of where mattermost is hosted +CHAT_PORT = env('CHAT_PORT', default=8065) # port of where mattermost is hosted +CHAT_URL = env('CHAT_URL', default='http://localhost:8065') # location of where mattermost is hosted CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='') # driver token - +GITCOIN_CHAT_TEAM_ID = env('GITCOIN_CHAT_TEAM_ID', default='') # Social Auth LOGIN_URL = 'gh_login' LOGOUT_URL = 'logout' diff --git a/app/app/urls.py b/app/app/urls.py index 6a769ae9a8a..c11c3ebe508 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -145,7 +145,7 @@ # chat url(r'^chat/web', chat.views.embed, name='web_chat'), url(r'^chat/web/', chat.views.embed, name='web_chat2'), - re_path(r'^chat/?', retail.views.chat, name='chat'), + re_path(r'^chat/?', chat.views.chat, name='chat'), # Health check endpoint re_path(r'^health/', include('health_check.urls')), re_path(r'^lbcheck/?', healthcheck.views.lbcheck, name='lbcheck'), diff --git a/app/chat/tasks.py b/app/chat/tasks.py index c00ec4c3d25..58324d6464a 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,16 +1,9 @@ -from django.conf import settings from app.redis_service import RedisService from celery import app, group from dashboard.models import Profile from celery.utils.log import get_task_logger -from mattermostdriver import Driver - -mm_driver = Driver({ - 'url': settings.CHAT_URL, - 'port': 443, - 'token': settings.CHAT_DRIVER_TOKEN -}) +from chat.utils import get_driver logger = get_task_logger(__name__) @@ -29,10 +22,10 @@ def create_channel(self, opts, retry: bool = True) -> None: """ with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: - mm_driver.channels.create_channel(options={ + new_channel = chat_driver.channels.create_channel(options={ 'team_id': opts['team_id'], 'name': opts['channel_name'], 'display_name': opts['channel_display_name'], @@ -46,6 +39,31 @@ def create_channel(self, opts, retry: bool = True) -> None: logger.error(str(e)) +@app.shared_task(bind=True, max_retries=3) +def add_to_channel(self, opts, retry: bool = True) -> None: + """ + :param opts: + :param retry: + :return: + """ + + with redis.lock("tasks:add_to_channel:%s" % opts['bounty'].title, timeout=LOCK_TIMEOUT): + + chat_driver = get_driver() + try: + for x in opts['profile']: + if x.chat_id is None: + chat_driver.channels.add_user(opts.bounty.chat_channel_id, options={ + 'user_id': x.chat_id + }) + except ConnectionError as exc: + logger.info(str(exc)) + logger.info("Retrying connection") + self.retry(30) + except Exception as e: + logger.error(str(e)) + + @app.shared_task(bind=True, max_retries=0) def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> None: """ @@ -57,7 +75,6 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> with redis.lock("tasks:sync_gitcoin_users_to_chat", timeout=60 * 10): try: - mm_driver.login() users = Profile.objects.filter(user__is_active=True).prefetch_related('user') @@ -103,10 +120,10 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> @app.shared_task(bind=True, max_retries=1) def create_user(self, options, params, retry: bool = True): with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: - create_user_response = mm_driver.users.create_user(options=options, params=params) + create_user_response = chat_driver.users.create_user(options=options, params=params) return create_user_response except ConnectionError as exc: @@ -132,17 +149,17 @@ def update_user(self, user, update_opts, retry: bool = True) -> None: return with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): - mm_driver.login() + chat_driver = get_driver() try: if user.profile.chat_id is None: - chat_user = mm_driver.users.get_user_by_username(user.profile.handle) + chat_user = chat_driver.users.get_user_by_username(user.profile.handle) if chat_user is None: raise ValueError(f'chat_user id is None for {user.profile.handle}') user.profile.chat_id = chat_user.id user.profile.save() - mm_driver.users.update_user(user.chat_id, options=update_opts) + chat_driver.users.update_user(user.chat_id, options=update_opts) except ConnectionError as exc: logger.info(str(exc)) logger.info("Retrying connection") diff --git a/app/retail/templates/chat.html b/app/chat/templates/chat.html similarity index 100% rename from app/retail/templates/chat.html rename to app/chat/templates/chat.html diff --git a/app/chat/utils.py b/app/chat/utils.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/chat/views.py b/app/chat/views.py index 52540d9651d..ba9ae5a98bf 100644 --- a/app/chat/views.py +++ b/app/chat/views.py @@ -20,21 +20,26 @@ from django.conf import settings from django.template.response import TemplateResponse -from django.templatetags.static import static from django.utils.translation import gettext_lazy as _ -from django.views.decorators.clickjacking import xframe_options_exempt +from chat.utils import get_driver -import requests +def chat(request): + """Render chat landing page response.""" -def embed(request): - """Handle the chat embed view.""" + chat_driver = get_driver() + + chat_stats = chat_driver.teams.get_team_stats(settings.GITCOIN_CHAT_TEAM_ID) - is_staff = request.user.is_staff if request.user.is_authenticated else False + context = { + 'chat_stats': chat_stats + } - # if not is_staff: - # context = dict(active='error', code=404, title="Error {}".format(404)) - # return TemplateResponse(request, 'error.html', context, status=404) + return TemplateResponse(request, 'chat.html', context) + + +def embed(request): + """Handle the chat embed view.""" context = { 'is_outside': True, diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 1802203441f..74fd4f75079 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -367,7 +367,7 @@ class Bounty(SuperModel): ) # TODO: Remove POST ORGS attached_job_description = models.URLField(blank=True, null=True, db_index=True) event = models.ForeignKey('dashboard.HackathonEvent', related_name='bounties', null=True, on_delete=models.SET_NULL, blank=True) - + chat_channel_id = models.CharField(max_length=255), # Bounty QuerySet Manager objects = BountyQuerySet.as_manager() diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 5ec716d6cad..080e8b2a71d 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -354,6 +354,83 @@ def new_interest(request, bounty_id): if interest.pending: start_work_new_applicant(interest, bounty) + if bounty.event is not None: + from app.chat.tasks import add_to_channel, create_channel, create_user + from django.utils.text import slugify + try: + if bounty.chat_channel_id is None: + + result = create_channel.apply_async({ + 'team_id': settings.GITCOIN_HACK_CHAT_TEAM_ID, + 'channel_name': bounty.title, + 'channel_display_name': f'bounty-{slugify(bounty.title)[:50]}' + }) + + bounty.chat_channel_id = result.get() + bounty.save() + funder_profile = Profile.objects.filter(handle=bounty.bounty_owner_github_username)[0] + + if funder_profile is not None: + if funder_profile.chat_id is None: + chat_funder_user = create_user.__call__( + options={ + "email": funder_profile.user.email, + "username": funder_profile.handle, + "first_name": funder_profile.user.first_name, + "last_name": funder_profile.user.last_name, + "nickname": "string", + "auth_data": funder_profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(funder_profile.user.email, 'chat') else True + } + }, + params={ + "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" + } + ) + + funder_profile.chat_id = chat_funder_user.id + funder_profile.save() + + if profile.chat_id is None: + chat_funder_user = create_user.__call__( + options={ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": "string", + "auth_data": profile.user.id, + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True + } + }, + params={ + "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" + } + ) + + profile.chat_id = chat_funder_user.id + profile.save() + + profiles_to_connect = [ + funder_profile, + profile + ] + + add_to_channel.delay({ + 'bounty': bounty, + 'profiles': profiles_to_connect + }) + + except Exception as e: + print(str(e)) except Interest.MultipleObjectsReturned: bounty_ids = bounty.interested \ .filter(profile_id=profile_id) \ diff --git a/app/retail/views.py b/app/retail/views.py index 18e04f814e3..d4d8d18f81f 100644 --- a/app/retail/views.py +++ b/app/retail/views.py @@ -830,9 +830,6 @@ def about(request): } return TemplateResponse(request, 'about.html', context) -def chat(request): - """Render chat landing page response.""" - return TemplateResponse(request, 'chat.html') def mission(request): """Render the Mission response.""" From bd60ba8cbf87f44b5c10b57dd68c7495a006fbc0 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sat, 21 Dec 2019 21:33:07 -0400 Subject: [PATCH 107/152] set nickname to profile handle when creating a new user --- app/dashboard/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 080e8b2a71d..de56d66b97b 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -402,7 +402,7 @@ def new_interest(request, bounty_id): "username": profile.handle, "first_name": profile.user.first_name, "last_name": profile.user.last_name, - "nickname": "string", + "nickname": profile.handle, "auth_data": profile.user.id, "auth_service": "gitcoin", "locale": "en", From d64f4db8e2caff63ca66bea0c32be2ace262c47c Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sat, 21 Dec 2019 21:33:47 -0400 Subject: [PATCH 108/152] when creating users in the sync task, set the nickname to the profile handle --- app/chat/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index 58324d6464a..d93d0610f15 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -88,7 +88,7 @@ def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> "username": profile.handle, "first_name": profile.user.first_name, "last_name": profile.user.last_name, - "nickname": "string", + "nickname": profile.handle, "auth_data": profile.user.id, "auth_service": "gitcoin", "locale": "en", From 3cf01c38933c1dd2af493bcc3810ee7d5653cff4 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sat, 4 Jan 2020 16:02:28 -0400 Subject: [PATCH 109/152] Chat 1.2 - General Availability chat/tasks contains the new celery tasks to handle communication with mattermost bountys with events will trigger channel creation and put the funder and interested hunter into the newly created channel --- app/app/settings.py | 5 +- .../management/commands/sync_users_to_chat.py | 24 ++-- app/chat/tasks.py | 111 ++++----------- app/dashboard/helpers.py | 2 - app/dashboard/models.py | 2 +- app/dashboard/views.py | 132 ++++++++++++------ app/git/utils.py | 3 - requirements/base.txt | 2 +- 8 files changed, 134 insertions(+), 147 deletions(-) diff --git a/app/app/settings.py b/app/app/settings.py index 158b176c57a..de4a1fc07d4 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -544,9 +544,10 @@ GITHUB_APP_NAME = env('GITHUB_APP_NAME', default='gitcoin-local') # Chat -CHAT_PORT = env('CHAT_PORT', default=8065) # port of where mattermost is hosted -CHAT_URL = env('CHAT_URL', default='http://localhost:8065') # location of where mattermost is hosted +CHAT_PORT = env('CHAT_PORT', default=443) # port of where mattermost is hosted +CHAT_URL = env('CHAT_URL', default='https://chat.gitcoin.co') # location of where mattermost is hosted CHAT_DRIVER_TOKEN = env('CHAT_DRIVER_TOKEN', default='') # driver token +GITCOIN_HACK_CHAT_TEAM_ID = env('GITCOIN_HACK_CHAT_TEAM_ID', default='') GITCOIN_CHAT_TEAM_ID = env('GITCOIN_CHAT_TEAM_ID', default='') # Social Auth LOGIN_URL = 'gh_login' diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py index f478451c52e..0574bb06319 100644 --- a/app/chat/management/commands/sync_users_to_chat.py +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -15,7 +15,7 @@ along with this program. If not, see . ''' - +from django.conf import settings from django.core.management.base import BaseCommand from dashboard.models import Profile from chat.tasks import create_user @@ -33,21 +33,19 @@ class Command(BaseCommand): def handle(self, *args, **options): try: - invite_token = '' users = Profile.objects.filter(user__is_active=True).prefetch_related('user') tasks = [] for profile in users: # if profile.chat_id is None: - print(profile) tasks.append(create_user.si(options={ "email": profile.user.email, "username": profile.handle, "first_name": profile.user.first_name, "last_name": profile.user.last_name, - "nickname": "string", - "auth_data": profile.user.id, + "nickname": profile.handle, + "auth_data": f'{profile.user.id}', "auth_service": "gitcoin", "locale": "en", "props": {}, @@ -61,18 +59,18 @@ def handle(self, *args, **options): "first_name": "false" }, }, params={ - "iid": invite_token + "tid": settings.GITCOIN_HACK_CHAT_TEAM_ID })) - print(tasks) job = group(tasks) result = job.apply_async() - - print(result.ready()) - - print(result.successful()) - - print(result.get()) + for r in result.get(): + if r is not None: + if 'username' in r and 'id' in r: + profile = Profile.objects.filter(handle=r['username'])[0] + if profile is not None: + profile.chat_id = r['id'] + profile.save() except ConnectionError as exec: print(str(exec)) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index d93d0610f15..9516567e063 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,9 +1,8 @@ - from app.redis_service import RedisService from celery import app, group -from dashboard.models import Profile from celery.utils.log import get_task_logger -from chat.utils import get_driver +from django.conf import settings +from mattermostdriver import Driver logger = get_task_logger(__name__) @@ -12,49 +11,55 @@ # Lock timeout of 2 minutes (just in the case that the application hangs to avoid a redis deadlock) LOCK_TIMEOUT = 60 * 2 +chat_driver = Driver({ + 'url': settings.CHAT_URL, + 'port': settings.CHAT_PORT, + 'token': settings.CHAT_DRIVER_TOKEN +}) + @app.shared_task(bind=True, max_retries=3) -def create_channel(self, opts, retry: bool = True) -> None: +def create_channel(self, options, retry: bool = True) -> None: """ - :param opts: + :param options: :param retry: :return: """ + with redis.lock("tasks:create_channel:%s" % options['channel_name'], timeout=LOCK_TIMEOUT): - with redis.lock("tasks:create_channel:%s" % opts['channel_name'], timeout=LOCK_TIMEOUT): - - chat_driver = get_driver() try: + chat_driver.login() new_channel = chat_driver.channels.create_channel(options={ - 'team_id': opts['team_id'], - 'name': opts['channel_name'], - 'display_name': opts['channel_display_name'], + 'team_id': options['team_id'], + 'name': options['channel_name'], + 'display_name': options['channel_display_name'], 'type': 'O' }) + + return new_channel except ConnectionError as exc: logger.info(str(exc)) logger.info("Retrying connection") self.retry(30) except Exception as e: + print("we got an exception when creating a channel") logger.error(str(e)) @app.shared_task(bind=True, max_retries=3) -def add_to_channel(self, opts, retry: bool = True) -> None: +def add_to_channel(self, options, retry: bool = True) -> None: """ - :param opts: + :param options: :param retry: :return: """ - - with redis.lock("tasks:add_to_channel:%s" % opts['bounty'].title, timeout=LOCK_TIMEOUT): - - chat_driver = get_driver() + with redis.lock("tasks:add_to_channel:%s" % options['channel_id'], timeout=LOCK_TIMEOUT): + chat_driver.login() try: - for x in opts['profile']: - if x.chat_id is None: - chat_driver.channels.add_user(opts.bounty.chat_channel_id, options={ - 'user_id': x.chat_id + for x in options['profiles']: + if x is not None: + response = chat_driver.channels.add_user(options['channel_id'], options={ + 'user_id': x }) except ConnectionError as exc: logger.info(str(exc)) @@ -63,68 +68,15 @@ def add_to_channel(self, opts, retry: bool = True) -> None: except Exception as e: logger.error(str(e)) - -@app.shared_task(bind=True, max_retries=0) -def sync_gitcoin_users_to_chat(self, invite_token=None, retry: bool = False) -> None: - """ - :param opts: - :param retry: - :return: - """ - - with redis.lock("tasks:sync_gitcoin_users_to_chat", timeout=60 * 10): - - try: - - users = Profile.objects.filter(user__is_active=True).prefetch_related('user') - - tasks = [] - - for profile in users: - # if profile.chat_id is None: - print(profile) - tasks.append(create_user.si(options={ - "email": profile.user.email, - "username": profile.handle, - "first_name": profile.user.first_name, - "last_name": profile.user.last_name, - "nickname": profile.handle, - "auth_data": profile.user.id, - "auth_service": "gitcoin", - "locale": "en", - "props": {}, - "notify_props": { - "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True - } - }, params={ - "iid": invite_token if invite_token else "" - })) - print(tasks) - job = group(tasks) - - result = job.apply_async() - - print(result.ready()) - - print(result.successful()) - - print(result.get()) - - except ConnectionError as exec: - print(str(exec)) - self.retry(30) - except Exception as e: - logger.error(str(e)) - - @app.shared_task(bind=True, max_retries=1) def create_user(self, options, params, retry: bool = True): with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): - chat_driver = get_driver() - try: - create_user_response = chat_driver.users.create_user(options=options, params=params) - + chat_driver.login() + create_user_response = chat_driver.users.create_user( + options=options, + params=params + ) return create_user_response except ConnectionError as exc: logger.info(str(exc)) @@ -149,7 +101,6 @@ def update_user(self, user, update_opts, retry: bool = True) -> None: return with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): - chat_driver = get_driver() try: if user.profile.chat_id is None: diff --git a/app/dashboard/helpers.py b/app/dashboard/helpers.py index e4bfa0c14ad..3fd2a102602 100644 --- a/app/dashboard/helpers.py +++ b/app/dashboard/helpers.py @@ -524,12 +524,10 @@ def create_new_bounty(old_bounties, bounty_payload, bounty_details, bounty_id): latest_old_bounty_dict['coupon_code'] = Coupon.objects.get(pk=latest_old_bounty_dict['coupon_code']) bounty_kwargs.update(latest_old_bounty_dict) - # bounty_on_create.delay() try: print('new bounty with kwargs:{}'.format(bounty_kwargs)) new_bounty = Bounty.objects.create(**bounty_kwargs) merge_bounty(latest_old_bounty, new_bounty, metadata, bounty_details) - bounty_on_create.delay(new_bounty) except Exception as e: print(e, 'encountered during new bounty creation for:', url) logger.error(f'{e} encountered during new bounty creation for: {url}') diff --git a/app/dashboard/models.py b/app/dashboard/models.py index 74fd4f75079..d6bee2534af 100644 --- a/app/dashboard/models.py +++ b/app/dashboard/models.py @@ -366,8 +366,8 @@ class Bounty(SuperModel): help_text=_('Organization Logo - Override'), ) # TODO: Remove POST ORGS attached_job_description = models.URLField(blank=True, null=True, db_index=True) + chat_channel_id = models.CharField(max_length=255, null=True) event = models.ForeignKey('dashboard.HackathonEvent', related_name='bounties', null=True, on_delete=models.SET_NULL, blank=True) - chat_channel_id = models.CharField(max_length=255), # Bounty QuerySet Manager objects = BountyQuerySet.as_manager() diff --git a/app/dashboard/views.py b/app/dashboard/views.py index de56d66b97b..65e0bb09153 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -110,7 +110,6 @@ @protected_resource() -@login_required() def oauth_connect(request, *args, **kwargs): active_user_profile = Profile.objects.filter(user_id=request.user.id).select_related()[0] from marketing.utils import should_suppress_notification_email @@ -119,9 +118,17 @@ def oauth_connect(request, *args, **kwargs): "email": active_user_profile.user.email, "name": active_user_profile.user.get_full_name(), "handle": active_user_profile.handle, - "id": active_user_profile.user.id, - "notifyProps" : { - "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True + "id": f'{active_user_profile.user.id}', + "auth_data": f'{active_user_profile.user.id}', + "auth_service": "gitcoin", + "notify_props": { + "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True, + "push": "mention", + "desktop": "all", + "desktop_sound": "true", + "mention_keys": f'{active_user_profile.handle}, @{active_user_profile.handle}', + "channel": "true", + "first_name": "false" } } return JsonResponse(user_profile, status=200, safe=False) @@ -354,78 +361,113 @@ def new_interest(request, bounty_id): if interest.pending: start_work_new_applicant(interest, bounty) - if bounty.event is not None: - from app.chat.tasks import add_to_channel, create_channel, create_user + if bounty.event and bounty.event.slug: + from chat.tasks import add_to_channel, create_channel, create_user, chat_driver from django.utils.text import slugify try: + if bounty.chat_channel_id is None: + bounty_channel_name = slugify(f'{bounty.github_org_name}-{bounty.github_issue_number}') - result = create_channel.apply_async({ - 'team_id': settings.GITCOIN_HACK_CHAT_TEAM_ID, - 'channel_name': bounty.title, - 'channel_display_name': f'bounty-{slugify(bounty.title)[:50]}' - }) + chat_driver.login() + channel_lookup = chat_driver.channels.get_channel_by_name(settings.GITCOIN_HACK_CHAT_TEAM_ID, bounty_channel_name) + + if 'message' in channel_lookup: + options = { + 'team_id': settings.GITCOIN_HACK_CHAT_TEAM_ID, + 'channel_display_name': f'{bounty_channel_name}-{bounty.title}'[:60], + 'channel_name': bounty_channel_name[:60] + } + result = create_channel.apply_async(args=[options]) + bounty_channel_id_response = result.get() + + if 'message' in bounty_channel_id_response: + raise ValueError(bounty_channel_id_response['message']) + + bounty.chat_channel_id = bounty_channel_id_response['id'] + bounty_channel_id = bounty_channel_id_response['id'] + bounty.save() + else: + bounty_channel_id = channel_lookup['id'] + bounty.chat_channel_id = bounty_channel_id + bounty.save() + else: + bounty_channel_id = bounty.chat_channel_id - bounty.chat_channel_id = result.get() - bounty.save() funder_profile = Profile.objects.filter(handle=bounty.bounty_owner_github_username)[0] if funder_profile is not None: if funder_profile.chat_id is None: - chat_funder_user = create_user.__call__( - options={ + result = create_user.apply_async(args=[{ "email": funder_profile.user.email, "username": funder_profile.handle, "first_name": funder_profile.user.first_name, "last_name": funder_profile.user.last_name, - "nickname": "string", - "auth_data": funder_profile.user.id, + "nickname": funder_profile.handle, + "auth_data": f'{funder_profile.user.id}', "auth_service": "gitcoin", "locale": "en", "props": {}, "notify_props": { - "email": False if should_suppress_notification_email(funder_profile.user.email, 'chat') else True - } - }, - params={ - "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" - } + "email": "false" if should_suppress_notification_email(funder_profile.user.email, 'chat') else "true", + "push": "mention", + "desktop": "all", + "desktop_sound": "true", + "mention_keys": f'{funder_profile.handle}, @{funder_profile.handle}', + "channel": "true", + "first_name": "false" + }, + }, { + "tid": settings.GITCOIN_HACK_CHAT_TEAM_ID + }] ) - funder_profile.chat_id = chat_funder_user.id + chat_profile_interest_user = result.get() + if 'message' in chat_profile_interest_user: + raise ValueError(chat_profile_interest_user['message']) + + funder_profile.chat_id = chat_profile_interest_user['id'] funder_profile.save() if profile.chat_id is None: - chat_funder_user = create_user.__call__( - options={ - "email": profile.user.email, - "username": profile.handle, - "first_name": profile.user.first_name, - "last_name": profile.user.last_name, - "nickname": profile.handle, - "auth_data": profile.user.id, - "auth_service": "gitcoin", - "locale": "en", - "props": {}, - "notify_props": { - "email": False if should_suppress_notification_email(profile.user.email, 'chat') else True - } + result = create_user.apply_async(args=[{ + "email": profile.user.email, + "username": profile.handle, + "first_name": profile.user.first_name, + "last_name": profile.user.last_name, + "nickname": profile.handle, + "auth_data": f'{profile.user.id}', + "auth_service": "gitcoin", + "locale": "en", + "props": {}, + "notify_props": { + "email": "false" if should_suppress_notification_email(profile.user.email, + 'chat') else "true", + "push": "mention", + "desktop": "all", + "desktop_sound": "true", + "mention_keys": f'{profile.handle}, @{profile.handle}', + "channel": "true", + "first_name": "false" }, - params={ - "iid": settings.GITCOIN_HACK_CHAT_TEAM_ID if settings.GITCOIN_HACK_CHAT_TEAM_ID else "" - } + }, { + "tid": settings.GITCOIN_HACK_CHAT_TEAM_ID + }] ) - profile.chat_id = chat_funder_user.id + chat_profile_interest_user = result.get() + if 'message' in chat_profile_interest_user: + raise ValueError(chat_profile_interest_user['message']) + profile.chat_id = chat_profile_interest_user['id'] profile.save() profiles_to_connect = [ - funder_profile, - profile + funder_profile.chat_id, + profile.chat_id ] add_to_channel.delay({ - 'bounty': bounty, + 'channel_id': bounty_channel_id, 'profiles': profiles_to_connect }) diff --git a/app/git/utils.py b/app/git/utils.py index c8bda993237..94045b1ee96 100644 --- a/app/git/utils.py +++ b/app/git/utils.py @@ -233,7 +233,6 @@ def get_auth_url(redirect_uri='/'): github_callback = reverse('social:begin', args=('github',)) redirect_params = {'next': BASE_URI + redirect_uri} redirect_uri = urlencode(redirect_params, quote_via=quote_plus) - params = { 'client_id': settings.GITHUB_CLIENT_ID, 'scope': settings.GITHUB_SCOPE, @@ -315,7 +314,6 @@ def get_github_event_emails(oauth_token, username): userinfo = get_user(username) user_name = userinfo.get('name', '') - print(user_name) if response.status_code == 200: events = response.json() @@ -603,7 +601,6 @@ def get_user(user, sub_path='', scope='', scoped=False, auth=None): else: user = user.replace('@', '') url = f'https://api.github.com/users/{user}{sub_path}?per_page={PER_PAGE_LIMIT}' - response = requests.get(url, auth=auth, headers=HEADERS) try: diff --git a/requirements/base.txt b/requirements/base.txt index 744e061256d..181974610d0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -42,7 +42,7 @@ django-environ==0.4.5 ipfshttpclient eth-utils==1.4.1 jsondiff==1.1.1 -social-auth-app-django==2.1.0 +social-auth-app-django==3.1.0 django-ipware==2.0.2 geoip2==2.8.0 django-silk==2.0.0 From 393f3e81a51d68720fd0133bbca66c2fd32c0309 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Sun, 5 Jan 2020 22:07:06 -0400 Subject: [PATCH 110/152] removing check for bounty.event.slug and just relying on an event existing to gate the channel creation --- app/dashboard/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 65e0bb09153..7222ea21e4c 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -361,7 +361,7 @@ def new_interest(request, bounty_id): if interest.pending: start_work_new_applicant(interest, bounty) - if bounty.event and bounty.event.slug: + if bounty.event: from chat.tasks import add_to_channel, create_channel, create_user, chat_driver from django.utils.text import slugify try: From 8062d87a61dd91a9b40e8fc8a9f5bb999befe766 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 7 Jan 2020 10:58:51 -0400 Subject: [PATCH 111/152] added gitcoin chat total user count into stats --- app/marketing/management/commands/pull_stats.py | 1 + app/marketing/stats.py | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/app/marketing/management/commands/pull_stats.py b/app/marketing/management/commands/pull_stats.py index ed4c99162f1..b598bcff8f0 100644 --- a/app/marketing/management/commands/pull_stats.py +++ b/app/marketing/management/commands/pull_stats.py @@ -45,6 +45,7 @@ def handle(self, *args, **options): stats.chrome_ext_users, stats.firefox_ext_users, stats.slack_users, + stats.chat_users, stats.slack_users_active, stats.twitter_followers, stats.bounties, diff --git a/app/marketing/stats.py b/app/marketing/stats.py index 6f803628c01..d08112784c3 100644 --- a/app/marketing/stats.py +++ b/app/marketing/stats.py @@ -91,6 +91,17 @@ def slack_users_active(): ) +def chat_users(): + from chat.tasks import chat_driver + chat_driver.login() + stats_request = chat_driver.users.stats() + if 'message' not in stats_request: + Stat.objects.create( + key='total_users', + val=stats_request['total_users_count'], + ) + + def profiles_ingested(): from dashboard.models import Profile From 9b64e9e393d990a8a3acc09a0f2b60384f67bcde Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 7 Jan 2020 11:51:25 -0400 Subject: [PATCH 112/152] notification dot added to the chat icon in the header, and a chat_unread_messages boolean added to context.py --- app/app/context.py | 20 ++++++++++++++++++++ app/assets/v2/js/base.js | 4 ++++ app/dashboard/templates/shared/chat_nav.html | 1 + 3 files changed, 25 insertions(+) diff --git a/app/app/context.py b/app/app/context.py index fdc866a84a4..34b5587d983 100644 --- a/app/app/context.py +++ b/app/app/context.py @@ -91,10 +91,30 @@ def preprocess(request): callback = request.GET.get('cb') handle_marketing_callback(callback, request) + chat_unread_messages = False + + if profile.chat_id: + try: + from chat.tasks import chat_driver + chat_driver.login() + + chat_unreads_request = chat_driver.teams.get_team_unreads_for_user( + profile.chat_id + ) + + if 'message' not in chat_unreads_request: + for teams in chat_unreads_request: + if teams['msg_count'] > 0: + chat_unread_messages = True + break + except Exception as e: + logger.error(str(e)) + context = { 'STATIC_URL': settings.STATIC_URL, 'MEDIA_URL': settings.MEDIA_URL, 'num_slack': num_slack, + 'chat_unread_messages' : chat_unread_messages, 'github_handle': request.user.username if user_is_authenticated else False, 'email': request.user.email if user_is_authenticated else False, 'name': request.user.get_full_name() if user_is_authenticated else False, diff --git a/app/assets/v2/js/base.js b/app/assets/v2/js/base.js index b263485f809..18195602334 100644 --- a/app/assets/v2/js/base.js +++ b/app/assets/v2/js/base.js @@ -406,3 +406,7 @@ const gitcoinUpdates = (force) => { if (document.contxt.github_handle) { gitcoinUpdates(); } + +if (document.contxt.chat_unread_messages) { + $('#chat-notification-dot').addClass('notification__dot__active'); +} diff --git a/app/dashboard/templates/shared/chat_nav.html b/app/dashboard/templates/shared/chat_nav.html index 42adbbcc424..5c8c155a13d 100644 --- a/app/dashboard/templates/shared/chat_nav.html +++ b/app/dashboard/templates/shared/chat_nav.html @@ -1,5 +1,6 @@ From daf8233711f8e8640197cc7c548408b7d84c7915 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 7 Jan 2020 11:53:16 -0400 Subject: [PATCH 113/152] adding mention count --- app/app/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app/context.py b/app/app/context.py index 34b5587d983..11781da0082 100644 --- a/app/app/context.py +++ b/app/app/context.py @@ -104,7 +104,7 @@ def preprocess(request): if 'message' not in chat_unreads_request: for teams in chat_unreads_request: - if teams['msg_count'] > 0: + if teams['msg_count'] > 0 or teams['mention_count'] > 0: chat_unread_messages = True break except Exception as e: From 8fb9c2bb4f1795602707d3eb2faaa2fdc66a9870 Mon Sep 17 00:00:00 2001 From: Dan Lipert Date: Mon, 6 Jan 2020 19:43:08 +0900 Subject: [PATCH 114/152] fix geoip download --- .travis.yml | 10 ++++++---- Dockerfile | 13 ++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9899a4cb97a..803a040586f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -32,11 +32,13 @@ jobs: - pip install codecov # Fetch and Install GeoIP database files. - sudo apt-get update && sudo apt-get install -y libmaxminddb-dev - - wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz - - wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz - - gunzip GeoLite2-City.mmdb.gz && gunzip GeoLite2-Country.mmdb.gz + - wget --output-document GeoLite2-City.mmdb.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&date=20191231&license_key=7PZQgKNxgqTRhkWy&suffix=tar.gz" + - wget --output-document GeoLite2-Country.mmdb.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&date=20191231&license_key=7PZQgKNxgqTRhkWy&suffix=tar.gz" + - gunzip GeoLite2-City.mmdb.tar.gz && gunzip GeoLite2-Country.mmdb.tar.gz + - tar -xvf GeoLite2-City.mmdb.tar && tar -xvf GeoLite2-Country.mmdb.tar - sudo mkdir -p /opt/GeoIP/ - - sudo mv *.mmdb /opt/GeoIP/ + - sudo mv GeoLite2-City_20191231/*.mmdb /opt/GeoIP/ + - sudo mv GeoLite2-Country_20191231/*.mmdb /opt/GeoIP/ # Install libvips dependencies. - sudo apt-get install -y libvips libvips-dev # Install Node and Python dependencies. diff --git a/Dockerfile b/Dockerfile index ed0ab581778..921278a10a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,11 +25,14 @@ RUN apt-get install -y python3-pip # GeoIP2 Data Files RUN mkdir -p /usr/share/GeoIP/ && \ - wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz && \ - wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz && \ - gunzip GeoLite2-City.mmdb.gz && \ - gunzip GeoLite2-Country.mmdb.gz && \ - mv *.mmdb /usr/share/GeoIP/ + wget --output-document GeoLite2-City.mmdb.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&date=20191231&license_key=7PZQgKNxgqTRhkWy&suffix=tar.gz" && \ + wget --output-document GeoLite2-Country.mmdb.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&date=20191231&license_key=7PZQgKNxgqTRhkWy&suffix=tar.gz" && \ + gunzip GeoLite2-City.mmdb.tar.gz && \ + gunzip GeoLite2-Country.mmdb.tar.gz && \ + tar -xvf GeoLite2-City.mmdb.tar && \ + tar -xvf GeoLite2-Country.mmdb.tar.gz && \ + mv GeoLite2-City_20191231/*.mmdb /usr/share/GeoIP/ && \ + mv GeoLite2-Country_20191231/*.mmdb /usr/share/GeoIP/ # Upgrade package essentials. RUN pip3 install --upgrade pip setuptools wheel dumb-init pipenv From 98caadbf9a8f0684101b0249ff3c6f3edfc0cc10 Mon Sep 17 00:00:00 2001 From: Dan Lipert Date: Mon, 6 Jan 2020 20:50:34 +0900 Subject: [PATCH 115/152] fix stylelint --- app/assets/v2/js/grants/detail.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/v2/js/grants/detail.js b/app/assets/v2/js/grants/detail.js index 467252d0c71..935251a27b9 100644 --- a/app/assets/v2/js/grants/detail.js +++ b/app/assets/v2/js/grants/detail.js @@ -15,7 +15,7 @@ $(document).ready(function() { $('#grant-admin').text(), $('#contract_owner_address').text(), '#cancel_grant', - 'Looks like your grant has been created with ' + + 'Looks like your grant has been created with ' + $('#contract_owner_address').text() + '. Switch to take action on your grant.' ); From 64b0a7388886cd0b8eab3e5f1145d68fcbacc5a1 Mon Sep 17 00:00:00 2001 From: Vivek Date: Wed, 25 Dec 2019 15:54:55 -0600 Subject: [PATCH 116/152] some small email changes as i practice gitting before 2019 ends --- app/retail/emails.py | 17 +++++++++-------- scripts/crontab | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/retail/emails.py b/app/retail/emails.py index 08a6ac247b7..baf3e2be964 100644 --- a/app/retail/emails.py +++ b/app/retail/emails.py @@ -389,7 +389,7 @@ def render_bounty_feedback(bounty, persona='submitter', previous_bounties=[]): alisa / frank (gitcoin product team) -PS - we've got some new gitcoin schwag on order. send me your mailing address and your t shirt size and i'll ship you some. +PS - we've got some new gitcoin schwag on order. if interested, let us know and we can send you a code to order some :) """ elif bounty.status == 'cancelled': @@ -410,7 +410,7 @@ def render_bounty_feedback(bounty, persona='submitter', previous_bounties=[]): alisa / frank (gitcoin product team) -PS - we've got some new gitcoin schwag on order. send me your mailing address and your t shirt size and i'll ship you some. +PS - we've got some new gitcoin schwag on order. if interested, let us know and we can send you a code to order some :) """ else: @@ -447,7 +447,7 @@ def render_admin_contact_funder(bounty, text, from_user): return response_html, response_txt -def render_funder_stale(github_username, days=30, time_as_str='about a month'): +def render_funder_stale(github_username, days=60, time_as_str='a couple months'): """Render the stale funder email template. Args: @@ -463,14 +463,15 @@ def render_funder_stale(github_username, days=30, time_as_str='about a month'): response_txt = f""" hi {github_username}, -alisa and frank from Gitcoin here (CC scott and vivek too) — i see you haven't funded an issue in {time_as_str}. in the spirit of making Gitcoin better + checking in: +alisa and frank from Gitcoin here (CC scott and vivek too) — i see you haven't funded an issue in {time_as_str}. +in the spirit of making Gitcoin better + checking in: -- has anything been slipping on your issue board which might be bounty worthy? +- have any issues which might be bounty worthy or projects you're hoping to build? - do you have any feedback for Gitcoin Core on how we might improve the product to fit your needs? +- are you interested in joining one of our upcoming hackathons? it's possible +we could do so at a discount, as you're a current funder on the platform -our idea is that gitcoin should be a place you come when priorities stretch long, and you need an extra set of capable hands. curious if this fits what you're looking for these days. - -appreciate you being a part of the community and let me know if you'd like some Gitcoin schwag — just send over a mailing address and a t-shirt size and it'll come your way. +appreciate you being a part of the community + let us know if you'd like some Gitcoin schwag, we can send a link your way to order some :) ~ alisa / frank (gitcoin product team) diff --git a/scripts/crontab b/scripts/crontab index e7b7977d88b..436dfb090bf 100644 --- a/scripts/crontab +++ b/scripts/crontab @@ -58,7 +58,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/us 30 1 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash sync_github >> /var/log/gitcoin/sync_github.log 2>&1 */15 * * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash get_notifications >> /var/log/gitcoin/get_notifications.log 2>&1 15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash bounty_feedback_email >> /var/log/gitcoin/bounty_feedback_email.log 2>&1 -15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash funder_stale_email 30 >> /var/log/gitcoin/funder_stale_email.log 2>&1 +15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash funder_stale_email 60 >> /var/log/gitcoin/funder_stale_email.log 2>&1 15 11 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash new_bounties_email >> /var/log/gitcoin/new_bounties_email.log 2>&1 15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash campaign_email >> /var/log/gitcoin/campaign_email.log 2>&1 15 10 * * * cd gitcoin/coin; bash scripts/run_management_command_if_not_already_running.bash send_unread_notification_emails_roundup >> /var/log/gitcoin/send_unread_notification_emails_roundup.log 2>&1 From d980117099bb8954e895e152fd409f18b6c39f8d Mon Sep 17 00:00:00 2001 From: Owocki Date: Mon, 6 Jan 2020 19:48:44 -0700 Subject: [PATCH 117/152] grants index --- app/grants/templates/grants/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/grants/templates/grants/index.html b/app/grants/templates/grants/index.html index 9f3b12824a0..f919c087fc9 100644 --- a/app/grants/templates/grants/index.html +++ b/app/grants/templates/grants/index.html @@ -61,7 +61,7 @@

    {% trans 'Get Substantial Sustain

    Gitcoin Grants has facilitated the distribution of ${{grant_amount|floatformat:0}}k to projects since - it's launch in January 2019. + its launch in January 2019. See more results.

    From ec213154f741e708232787741e0752207bd9d9e2 Mon Sep 17 00:00:00 2001 From: Aditya Anand M C Date: Thu, 2 Jan 2020 19:00:40 +0530 Subject: [PATCH 118/152] chore: prettify load more grants text --- app/assets/v2/css/base.css | 4 ++++ app/grants/templates/grants/index.html | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/assets/v2/css/base.css b/app/assets/v2/css/base.css index 1c073469433..1c0ffbae303 100644 --- a/app/assets/v2/css/base.css +++ b/app/assets/v2/css/base.css @@ -20,6 +20,10 @@ a { color: #3E00FF; } +.cursor-pointer { + cursor: pointer !important; +} + .nav_avatar { width: 40px; height: 40px; diff --git a/app/grants/templates/grants/index.html b/app/grants/templates/grants/index.html index f919c087fc9..81dba0ea50f 100644 --- a/app/grants/templates/grants/index.html +++ b/app/grants/templates/grants/index.html @@ -262,7 +262,14 @@

    {% endfor %}

    {% if grants.has_next %} - More +

    + + + Collecting more exciting grants + +

    {% endif %} {% else %}
    From e722ed8c9033a1fae5c2d07b84a64962e07fbb11 Mon Sep 17 00:00:00 2001 From: Dan Lipert Date: Tue, 7 Jan 2020 19:32:52 +0900 Subject: [PATCH 119/152] improve quest feedback email" (#5666) * improve quest feedback email" * fix multiline string * Update mails.py Co-authored-by: Aditya Anand M C --- app/marketing/mails.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/marketing/mails.py b/app/marketing/mails.py index f0d2661bfb7..9f191247b4a 100644 --- a/app/marketing/mails.py +++ b/app/marketing/mails.py @@ -434,12 +434,14 @@ def new_grant_admin(grant): def send_user_feedback(quest, feedback, user): to_email = quest.creator.email - from_email = user.email + from_email = settings.SERVER_EMAIL cur_language = translation.get_language() try: setup_lang(to_email) - subject = f"New Gitcoin Quest Feedback: {quest.title}" - body_str = f"quest: {quest.title}\nurl: {quest.url}\nedit: {quest.edit_url}\n\n> {feedback}\n\nfrom: {user.email} ( {user.profile.url} )" + subject = f"Your Gitcoin Quest \"{quest.title}\" has feedback from another user!" + body_str = f("Your quest: {quest.title} has feedback from user {user.profile.handle}:\n\n" + "{feedback}\n\n" + "to edit your quest, click here") body = f"{body_str}" if not should_suppress_notification_email(to_email, 'quest'): send_mail( From 44d2ba619f59b144b76ca34df0c09dd22d40efe8 Mon Sep 17 00:00:00 2001 From: Korridzy Date: Tue, 7 Jan 2020 17:23:28 +0300 Subject: [PATCH 120/152] fixing a mistype in tar extraction for GeoLite (#5714) Fixes: https://github.com/gitcoinco/web/issues/5696 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 921278a10a8..102ce3ffff5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,7 +30,7 @@ RUN mkdir -p /usr/share/GeoIP/ && \ gunzip GeoLite2-City.mmdb.tar.gz && \ gunzip GeoLite2-Country.mmdb.tar.gz && \ tar -xvf GeoLite2-City.mmdb.tar && \ - tar -xvf GeoLite2-Country.mmdb.tar.gz && \ + tar -xvf GeoLite2-Country.mmdb.tar && \ mv GeoLite2-City_20191231/*.mmdb /usr/share/GeoIP/ && \ mv GeoLite2-Country_20191231/*.mmdb /usr/share/GeoIP/ From b36c989707a803353745ea5bc8df689f9f72be0a Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Tue, 7 Jan 2020 15:25:28 -0400 Subject: [PATCH 121/152] updated update_user job to not rely on serialized query objects --- app/chat/tasks.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/chat/tasks.py b/app/chat/tasks.py index 9516567e063..df25d963e20 100644 --- a/app/chat/tasks.py +++ b/app/chat/tasks.py @@ -1,7 +1,9 @@ from app.redis_service import RedisService from celery import app, group from celery.utils.log import get_task_logger +from dashboard.models import Profile from django.conf import settings + from mattermostdriver import Driver logger = get_task_logger(__name__) @@ -68,6 +70,7 @@ def add_to_channel(self, options, retry: bool = True) -> None: except Exception as e: logger.error(str(e)) + @app.shared_task(bind=True, max_retries=1) def create_user(self, options, params, retry: bool = True): with redis.lock("tasks:create_user:%s" % options['username'], timeout=LOCK_TIMEOUT): @@ -88,10 +91,10 @@ def create_user(self, options, params, retry: bool = True): @app.shared_task(bind=True, max_retries=3) -def update_user(self, user, update_opts, retry: bool = True) -> None: +def update_user(self, query_opts, update_opts, retry: bool = True) -> None: """ :param self: - :param user: + :param query_opts: :param update_opts: :param retry: :return: None @@ -100,17 +103,21 @@ def update_user(self, user, update_opts, retry: bool = True) -> None: if update_opts is None: return - with redis.lock("tasks:update_user:%s" % user.profile.handle, timeout=LOCK_TIMEOUT): + with redis.lock("tasks:update_user:%s" % query_opts['handle'], timeout=LOCK_TIMEOUT): try: - if user.profile.chat_id is None: - chat_user = chat_driver.users.get_user_by_username(user.profile.handle) - if chat_user is None: - raise ValueError(f'chat_user id is None for {user.profile.handle}') - user.profile.chat_id = chat_user.id - user.profile.save() - - chat_driver.users.update_user(user.chat_id, options=update_opts) + + if query_opts['chat_id'] is None: + chat_user = chat_driver.users.get_user_by_username(query_opts['handle']) + if 'message' not in chat_user: + chat_id = chat_user['id'] + else: + chat_id = query_opts['chat_id'] + + user_profile = Profile.objects.filter(handle=query_opts['handle']) + user_profile.chat_id = chat_id + user_profile.save() + chat_driver.users.update_user(chat_id, options=update_opts) except ConnectionError as exc: logger.info(str(exc)) logger.info("Retrying connection") From d0b7075e4b71515085aadf10cea8440cfa79d3fb Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Wed, 8 Jan 2020 07:50:25 -0400 Subject: [PATCH 122/152] updated code to reflect review --- .../management/commands/sync_users_to_chat.py | 14 +++++++------- app/dashboard/views.py | 17 +++++++++-------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py index 0574bb06319..987577e0ff8 100644 --- a/app/chat/management/commands/sync_users_to_chat.py +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -33,11 +33,11 @@ class Command(BaseCommand): def handle(self, *args, **options): try: - users = Profile.objects.filter(user__is_active=True).prefetch_related('user') + profiles = Profile.objects.filter(user__is_active=True, chat__id__exact='').prefetch_related('user') tasks = [] - for profile in users: + for profile in profiles: # if profile.chat_id is None: tasks.append(create_user.si(options={ "email": profile.user.email, @@ -64,12 +64,12 @@ def handle(self, *args, **options): job = group(tasks) result = job.apply_async() - for r in result.get(): - if r is not None: - if 'username' in r and 'id' in r: - profile = Profile.objects.filter(handle=r['username'])[0] + for result_req in result.get(): + if 'message' not in result_req: + if 'username' in result_req and 'id' in result_req: + profile = Profile.objects.get(handle=result_req['username']) if profile is not None: - profile.chat_id = r['id'] + profile.chat_id = result_req['id'] profile.save() except ConnectionError as exec: diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 7222ea21e4c..60ee7a9ec16 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -23,6 +23,7 @@ import logging import os import time + from copy import deepcopy from datetime import datetime from decimal import Decimal @@ -32,7 +33,6 @@ from django.contrib.admin.views.decorators import staff_member_required from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User -from django.core import serializers from django.core.exceptions import PermissionDenied from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator from django.db.models import Avg, Count, Prefetch, Q @@ -45,11 +45,11 @@ from django.utils import timezone from django.utils.html import escape, strip_tags from django.utils.http import is_safe_url -from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_GET, require_POST +from django.utils.text import slugify import magic from app.utils import clean_str, ellipses, get_default_network @@ -57,6 +57,7 @@ from avatar.views_3d import avatar3dids_helper, hair_tones, skin_tones from bleach import clean from cacheops import invalidate_obj +from chat.tasks import add_to_channel, chat_driver, create_channel, create_user from dashboard.context import quickstart as qs from dashboard.utils import ( ProfileHiddenException, ProfileNotFoundException, get_bounty_from_invite_url, get_orgs_perms, profile_helper, @@ -362,8 +363,6 @@ def new_interest(request, bounty_id): start_work_new_applicant(interest, bounty) if bounty.event: - from chat.tasks import add_to_channel, create_channel, create_user, chat_driver - from django.utils.text import slugify try: if bounty.chat_channel_id is None: @@ -394,11 +393,12 @@ def new_interest(request, bounty_id): else: bounty_channel_id = bounty.chat_channel_id - funder_profile = Profile.objects.filter(handle=bounty.bounty_owner_github_username)[0] + funder_profile = Profile.objects.get(handle=bounty.bounty_owner_github_username) if funder_profile is not None: if funder_profile.chat_id is None: - result = create_user.apply_async(args=[{ + result = create_user.apply_async(args=[ + { "email": funder_profile.user.email, "username": funder_profile.handle, "first_name": funder_profile.user.first_name, @@ -419,8 +419,8 @@ def new_interest(request, bounty_id): }, }, { "tid": settings.GITCOIN_HACK_CHAT_TEAM_ID - }] - ) + } + ]) chat_profile_interest_user = result.get() if 'message' in chat_profile_interest_user: @@ -458,6 +458,7 @@ def new_interest(request, bounty_id): chat_profile_interest_user = result.get() if 'message' in chat_profile_interest_user: raise ValueError(chat_profile_interest_user['message']) + profile.chat_id = chat_profile_interest_user['id'] profile.save() From ff8c53b21c146077f4fa5879c6f8db87186af0d1 Mon Sep 17 00:00:00 2001 From: Andrew Redden Date: Wed, 8 Jan 2020 08:57:17 -0400 Subject: [PATCH 123/152] disabled email notify props for initial release --- app/chat/management/commands/sync_users_to_chat.py | 2 +- app/dashboard/views.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/chat/management/commands/sync_users_to_chat.py b/app/chat/management/commands/sync_users_to_chat.py index 987577e0ff8..9d24f97055c 100644 --- a/app/chat/management/commands/sync_users_to_chat.py +++ b/app/chat/management/commands/sync_users_to_chat.py @@ -50,7 +50,7 @@ def handle(self, *args, **options): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(profile.user.email, 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", diff --git a/app/dashboard/views.py b/app/dashboard/views.py index 60ee7a9ec16..412091a103a 100644 --- a/app/dashboard/views.py +++ b/app/dashboard/views.py @@ -123,7 +123,7 @@ def oauth_connect(request, *args, **kwargs): "auth_data": f'{active_user_profile.user.id}', "auth_service": "gitcoin", "notify_props": { - "email": False if should_suppress_notification_email(active_user_profile.user.email, 'chat') else True, + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", @@ -409,7 +409,7 @@ def new_interest(request, bounty_id): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(funder_profile.user.email, 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", @@ -441,8 +441,7 @@ def new_interest(request, bounty_id): "locale": "en", "props": {}, "notify_props": { - "email": "false" if should_suppress_notification_email(profile.user.email, - 'chat') else "true", + "email": "false", "push": "mention", "desktop": "all", "desktop_sound": "true", From 4b9b713af7185038f05ebd5911a10dc6af1a9761 Mon Sep 17 00:00:00 2001 From: Aditya Anand M C Date: Wed, 8 Jan 2020 19:02:23 +0530 Subject: [PATCH 124/152] chore: cleanup (#5701) * update 2018 -> 2020 * chore: {%if%} -> {% if %}, {%endif%} -> {% endif %}, {%elif%} -> {% elif %} --- app/app/context.py | 2 +- app/app/log_filters.py | 2 +- app/app/pipeline.py | 2 +- app/app/settings.py | 2 +- app/app/templates/shared/messages.html | 2 +- app/app/templates/shared/rain.html | 2 +- app/app/templates/shared/sentry.html | 2 +- app/app/tests/test_app_urls.py | 2 +- app/app/thumbnail_processors.py | 2 +- app/app/urls.py | 2 +- app/app/wsgi.py | 2 +- app/avatar/admin.py | 2 +- app/avatar/apps.py | 2 +- app/avatar/models.py | 2 +- app/avatar/templatetags/avatar_tags.py | 2 +- app/avatar/urls.py | 2 +- app/avatar/utils.py | 2 +- app/avatar/views.py | 2 +- app/avatar/views_3d.py | 2 +- app/bounty_requests/admin.py | 2 +- app/bounty_requests/forms.py | 2 +- .../commands/bounty_requests_email.py | 2 +- app/bounty_requests/models.py | 2 +- .../templates/bounty_request_form.html | 2 +- app/bounty_requests/views.py | 2 +- app/chat/views.py | 2 +- app/dashboard/apps.py | 2 +- app/dashboard/helpers.py | 2 +- .../management/commands/calc_profile.py | 2 +- .../commands/create_activity_records.py | 2 +- .../management/commands/create_earnings.py | 2 +- .../management/commands/create_pagerank.py | 2 +- .../management/commands/migrate_profiles.py | 2 +- .../send_tips_for_bounty_fulfiller.py | 2 +- .../management/commands/setup_grants_clr_3.py | 2 +- .../management/commands/sync_listener.py | 2 +- app/dashboard/notifications.py | 2 +- app/dashboard/router.py | 2 +- app/dashboard/signals.py | 2 +- app/dashboard/templates/addinterest.html | 2 +- app/dashboard/templates/bounty/change.html | 2 +- app/dashboard/templates/bounty/fulfill.html | 2 +- app/dashboard/templates/bounty/fund.html | 4 +- app/dashboard/templates/bounty/invoice.html | 4 +- app/dashboard/templates/bounty/kill.html | 2 +- .../bounty/process_refund_request.html | 2 +- .../templates/bulk_payout_bounty.html | 2 +- app/dashboard/templates/dashboard/ftux.html | 2 +- .../dashboard/hackathon/onboard.html | 2 +- .../dashboard/hackathon/projects.html | 2 +- .../templates/dashboard/sidebar_search.html | 2 +- .../dashboard/sidebar_search_hackathon.html | 2 +- .../templates/extend_issue_deadline.html | 2 +- app/dashboard/templates/ftux/avatar.html | 9 ++- app/dashboard/templates/ftux/github.html | 2 +- app/dashboard/templates/ftux/job.html | 2 +- app/dashboard/templates/ftux/metamask.html | 2 +- app/dashboard/templates/ftux/onboard.html | 2 +- app/dashboard/templates/ftux/skills.html | 2 +- .../funder_payout_reminder_modal.html | 2 +- app/dashboard/templates/labs.html | 2 +- app/dashboard/templates/legal/terms.html | 2 +- app/dashboard/templates/notifyfunder.html | 2 +- app/dashboard/templates/onepager/base.html | 2 +- app/dashboard/templates/onepager/receive.html | 12 ++-- app/dashboard/templates/onepager/send1.html | 2 +- app/dashboard/templates/onepager/send2.html | 4 +- app/dashboard/templates/payout_bounty.html | 2 +- .../templates/profiles/activity_stats.html | 2 +- app/dashboard/templates/profiles/hidden.html | 2 +- app/dashboard/templates/profiles/none.html | 2 +- .../templates/profiles/organization.html | 2 +- .../profiles/tab_grant_contribs.html | 10 +-- .../templates/profiles/tab_resume.html | 2 +- app/dashboard/templates/profiles/tabs.html | 42 ++++++------- app/dashboard/templates/quickstart.html | 2 +- app/dashboard/templates/quickstart_video.html | 2 +- app/dashboard/templates/rating_capture.html | 2 +- app/dashboard/templates/rating_modal.html | 2 +- app/dashboard/templates/shared/add_kudos.html | 2 +- .../templates/shared/bounty-popover.html | 2 +- .../shared/bounty_actions_hidden_vars.html | 2 +- .../templates/shared/bounty_categories.html | 2 +- .../templates/shared/bounty_details.html | 2 +- .../templates/shared/bounty_keywords.html | 2 +- .../templates/shared/bounty_nav.html | 4 +- .../shared/bounty_waiting_state.html | 2 +- .../templates/shared/connect_metamask.html | 2 +- app/dashboard/templates/shared/disqus.html | 2 +- app/dashboard/templates/shared/featured.html | 2 +- .../templates/shared/gas_advisories.html | 2 +- .../templates/shared/gas_history.html | 2 +- app/dashboard/templates/shared/gas_nav.html | 2 +- .../templates/shared/github_link.html | 2 +- .../templates/shared/github_username.html | 2 +- .../templates/shared/hackathon_sponsors.html | 2 +- .../templates/shared/hours_worked.html | 2 +- .../templates/shared/issue_deadline.html | 2 +- .../templates/shared/issue_details.html | 2 +- app/dashboard/templates/shared/lab_hero.html | 2 +- app/dashboard/templates/shared/labs_nav.html | 2 +- app/dashboard/templates/shared/nav_auth.html | 2 +- .../templates/shared/newsletter.html | 2 +- .../templates/shared/no_issue_error.html | 2 +- .../templates/shared/no_metamask_error.html | 2 +- .../templates/shared/notification_email.html | 2 +- .../templates/shared/notifications.html | 2 +- .../templates/shared/onepager_auth.html | 2 +- .../shared/organization_tooltip.html | 2 +- .../templates/shared/payout_address.html | 2 +- .../shared/permissions_type_tooltip.html | 2 +- app/dashboard/templates/shared/pricing.html | 2 +- .../shared/project_type_tooltip.html | 2 +- app/dashboard/templates/shared/rating.html | 2 +- app/dashboard/templates/shared/reserved.html | 2 +- .../templates/shared/search_bar.html | 2 +- .../templates/shared/send_tip_nav.html | 10 +-- .../shared/show_information_publicly.html | 2 +- .../templates/shared/sidebar_profile.html | 2 +- .../templates/shared/status_tooltip.html | 2 +- .../templates/shared/success_container.html | 2 +- .../templates/shared/unlock_metamask.html | 2 +- .../templates/shared/waiting_state.html | 2 +- .../templates/shared/wallet_estimate.html | 2 +- .../templates/shared/zero_balance_error.html | 2 +- .../templates/social_contribution_modal.html | 2 +- app/dashboard/templates/toolbox.html | 2 +- app/dashboard/templatetags/add_url_schema.py | 2 +- app/dashboard/templatetags/trim.py | 2 +- app/dashboard/tests/test_dashboard_embed.py | 2 +- app/dashboard/tests/test_dashboard_helpers.py | 2 +- app/dashboard/tests/test_dashboard_models.py | 2 +- app/dashboard/tests/test_dashboard_utils.py | 2 +- app/dashboard/tests/test_notifications.py | 2 +- app/dashboard/tests/test_tokens.py | 2 +- app/dashboard/tests/test_users_list.py | 2 +- app/dashboard/tip_views.py | 2 +- app/dashboard/utils.py | 2 +- app/dataviz/admin.py | 2 +- app/dataviz/apps.py | 2 +- app/dataviz/d3_views.py | 2 +- app/dataviz/models.py | 2 +- app/dataviz/templates/cohort.html | 40 ++++++------ app/dataviz/templates/dataviz/circles.html | 2 +- app/dataviz/templates/dataviz/heatmap.html | 2 +- app/dataviz/templates/dataviz/spiral.html | 2 +- app/dataviz/templates/dataviz/sunburst.html | 2 +- app/dataviz/templates/stats.html | 2 +- app/dataviz/views.py | 2 +- app/economy/admin.py | 2 +- app/economy/apps.py | 2 +- app/economy/management/commands/get_prices.py | 2 +- .../management/commands/refresh_bounties.py | 2 +- app/economy/models.py | 2 +- app/economy/tests/test_economy_utils.py | 2 +- app/economy/utils.py | 2 +- app/enssubdomain/admin.py | 2 +- .../management/commands/reprocess_txs.py | 2 +- app/enssubdomain/models.py | 2 +- app/enssubdomain/tests/test_ens_utils.py | 2 +- app/enssubdomain/utils.py | 2 +- app/enssubdomain/views.py | 2 +- .../templates/ethdenver2019/base.html | 2 +- .../templates/ethdenver2019/onepager.html | 4 +- .../templates/ethdenver2019/receive_bulk.html | 14 ++--- .../templates/ethdenver2019/redeem.html | 2 +- app/faucet/admin.py | 2 +- app/faucet/models.py | 2 +- app/faucet/templates/faucet_form.html | 2 +- .../templates/process_faucet_request.html | 2 +- .../shared/faucet_no_metamask_error.html | 2 +- .../shared/faucet_over_balance_error.html | 2 +- .../shared/faucet_unlock_metamask.html | 2 +- app/faucet/views.py | 2 +- app/gas/models.py | 2 +- app/gas/tests/test_gas_utils.py | 2 +- app/git/apps.py | 2 +- .../management/commands/check_gh_ratelimit.py | 2 +- app/git/tests/test_utils.py | 2 +- app/git/utils.py | 2 +- app/gitcoinbot/actions.py | 2 +- app/gitcoinbot/apps.py | 2 +- .../tests/test_gitcoinbot_actions.py | 2 +- app/gitcoinbot/views.py | 2 +- app/grants/abi.py | 2 +- app/grants/admin.py | 2 +- app/grants/apps.py | 2 +- app/grants/clr.py | 2 +- app/grants/forms.py | 2 +- .../management/commands/estimate_clr.py | 2 +- .../commands/grant_vitalik_shuffle.py | 2 +- .../commands/insert_contributions.py | 2 +- app/grants/management/commands/subminer.py | 2 +- app/grants/models.py | 2 +- app/grants/templates/grants/activity.html | 10 +-- app/grants/templates/grants/cancel.html | 2 +- app/grants/templates/grants/card/back.html | 2 +- app/grants/templates/grants/card/front.html | 2 +- app/grants/templates/grants/card/index.html | 2 +- app/grants/templates/grants/detail/index.html | 2 +- app/grants/templates/grants/detail/info.html | 2 +- app/grants/templates/grants/detail/tabs.html | 2 +- app/grants/templates/grants/faq.html | 2 +- app/grants/templates/grants/fund.html | 2 +- app/grants/templates/grants/index.html | 6 +- app/grants/templates/grants/invoice.html | 4 +- app/grants/templates/grants/leaderboard.html | 2 +- app/grants/templates/grants/new.html | 2 +- app/grants/templates/grants/newv0.html | 2 +- app/grants/templates/grants/quickstart.html | 2 +- app/grants/templates/grants/shared/alpha.html | 2 +- app/grants/templates/grants/shared/error.html | 2 +- .../grants/shared/shared_scripts.html | 2 +- .../grants/shared/waiting_state.html | 2 +- app/grants/templatetags/grants_extra.py | 2 +- app/grants/urls.py | 2 +- app/grants/utils.py | 2 +- app/grants/views.py | 2 +- app/healthcheck/apps.py | 2 +- app/healthcheck/healthchecks.py | 2 +- app/inbox/admin.py | 2 +- app/inbox/apps.py | 2 +- app/inbox/models.py | 2 +- app/inbox/signals.py | 2 +- app/inbox/urls.py | 2 +- app/inbox/utils.py | 2 +- app/inbox/views.py | 2 +- app/kudos/admin.py | 2 +- app/kudos/forms.py | 2 +- app/kudos/helpers.py | 2 +- app/kudos/management/commands/burn_kudos.py | 2 +- .../management/commands/change_kudos_price.py | 2 +- app/kudos/management/commands/clone_kudos.py | 2 +- .../management/commands/mint_all_kudos.py | 2 +- .../commands/sync_kudos_listener.py | 2 +- .../commands/update_kudos_metadata.py | 2 +- .../management/commands/update_popularity.py | 2 +- .../management/commands/update_tx_status.py | 2 +- app/kudos/models.py | 2 +- app/kudos/router.py | 2 +- app/kudos/templates/kudos_mint.html | 2 +- app/kudos/templates/shared/kudos_banner.html | 2 +- .../shared/kudos_card_hover_content.html | 2 +- .../templates/shared/kudos_card_profile.html | 2 +- app/kudos/templates/transaction/base.html | 2 +- .../templates/transaction/kudos_auth.html | 2 +- app/kudos/templates/transaction/receive.html | 12 ++-- .../templates/transaction/receive_bulk.html | 16 ++--- app/kudos/templates/transaction/send.html | 4 +- app/kudos/templatetags/kudos_extras.py | 2 +- app/kudos/test_models.py | 2 +- app/kudos/test_utils.py | 2 +- app/kudos/test_views.py | 2 +- app/kudos/utils.py | 2 +- app/kudos/views.py | 2 +- app/legacy/urls.py | 2 +- app/manage.py | 2 +- app/marketing/mails.py | 2 +- .../commands/assemble_leaderboards.py | 2 +- .../management/commands/backfill_analytics.py | 2 +- .../management/commands/campaign_email.py | 2 +- .../management/commands/funder_stale_email.py | 2 +- .../management/commands/gdpr_reconsent_eu.py | 2 +- .../management/commands/make_request_coins.py | 2 +- .../commands/process_email_events.py | 2 +- .../management/commands/pull_github.py | 2 +- app/marketing/models.py | 2 +- app/marketing/signals.py | 2 +- app/marketing/stats.py | 2 +- .../commands/test_assemble_leaderboards.py | 2 +- .../management/commands/test_expiration.py | 2 +- .../commands/test_expiration_start_work.py | 2 +- .../commands/test_expiration_tip.py | 2 +- .../commands/test_remarket_tweet.py | 2 +- .../tests/management/commands/test_roundup.py | 2 +- ...send_unread_notification_emails_roundup.py | 2 +- .../management/commands/test_sync_keywords.py | 2 +- app/marketing/tests/test_mails.py | 2 +- app/marketing/tests/test_marketing_utils.py | 2 +- app/marketing/utils.py | 2 +- app/marketing/views.py | 2 +- app/quests/templates/quests/base.html | 2 +- app/quests/templates/quests/index.html | 61 ++++++++++--------- app/quests/templates/quests/new.html | 16 ++--- .../templates/quests/types/example.html | 2 +- .../templates/quests/types/quiz_style.html | 2 +- app/retail/forms.py | 2 +- app/retail/templates/about.html | 2 +- app/retail/templates/activity.html | 2 +- app/retail/templates/base.html | 2 +- .../templates/bounties/contributor.html | 2 +- .../bounties/contributor/activity.html | 2 +- .../bounties/contributor/explorer.html | 2 +- app/retail/templates/bounties/funder.html | 2 +- .../templates/bounties/funder/howworks.html | 2 +- app/retail/templates/email_unsubscribed.html | 2 +- app/retail/templates/emails/bounty.html | 10 +-- .../templates/emails/bounty_changed.html | 2 +- .../templates/emails/bounty_request.html | 2 +- .../templates/emails/bounty_roundup.html | 2 +- app/retail/templates/emails/bounty_small.html | 2 +- .../bounty_startwork_expire_warning.html | 2 +- .../templates/emails/bounty_uninterested.html | 2 +- .../campaigns/email_campaign_day_1.html | 2 +- .../campaigns/email_campaign_day_2.html | 2 +- .../campaigns/email_campaign_day_3.html | 2 +- .../emails/faucet_request_rejected.html | 2 +- .../templates/emails/gdpr_reconsent.html | 2 +- .../emails/grants/grant_cancellation.html | 2 +- .../templates/emails/grants/new_grant.html | 2 +- .../emails/grants/new_supporter.html | 2 +- .../grants/subscription_terminated.html | 2 +- .../grants/successful_contribution.html | 2 +- .../emails/grants/support_cancellation.html | 2 +- .../grants/thank_you_for_supporting.html | 2 +- .../emails/grants/transaction_summary.html | 2 +- .../emails/grants/update_notification.html | 2 +- app/retail/templates/emails/kudos_mint.html | 2 +- app/retail/templates/emails/kudos_mkt.html | 2 +- app/retail/templates/emails/new_bounty.html | 2 +- app/retail/templates/emails/new_bounty.txt | 2 +- .../emails/new_bounty_acceptance.html | 2 +- .../emails/new_bounty_expire_warning.html | 2 +- .../emails/new_bounty_rejection.html | 2 +- app/retail/templates/emails/new_kudos.html | 2 +- app/retail/templates/emails/new_kudos.txt | 2 +- app/retail/templates/emails/new_match.html | 2 +- app/retail/templates/emails/new_tip.html | 2 +- .../emails/recap/weekly_founder_recap.html | 2 +- .../templates/emails/reserved_issue.html | 2 +- .../emails/shared_bounty_actions.html | 2 +- .../templates/emails/start_work_rejected.html | 2 +- app/retail/templates/emails/template.html | 2 +- ...ead_notification_email_weekly_roundup.html | 2 +- app/retail/templates/gas_heatmap.html | 2 +- app/retail/templates/home/index.html | 2 +- .../templates/how_it_works/contributor.html | 2 +- .../templates/how_it_works/disputes.html | 2 +- app/retail/templates/how_it_works/funder.html | 2 +- app/retail/templates/how_it_works/index.html | 2 +- .../templates/how_it_works/payment.html | 2 +- .../templates/how_it_works/permissions.html | 2 +- .../templates/how_it_works/project_types.html | 2 +- .../increase_funding_limit_request_form.html | 2 +- app/retail/templates/newkudos.html | 2 +- app/retail/templates/newtoken.html | 2 +- app/retail/templates/presskit.html | 2 +- app/retail/templates/presskit/colors.html | 2 +- .../templates/presskit/illustrations.html | 2 +- app/retail/templates/presskit/logo.html | 2 +- app/retail/templates/presskit/resources.html | 2 +- app/retail/templates/pricing/plans.html | 2 +- app/retail/templates/pricing/subscribe.html | 2 +- app/retail/templates/products.html | 2 +- app/retail/templates/results.html | 24 ++++---- app/retail/templates/settings/privacy.html | 2 +- app/retail/templates/settings/settings.html | 4 +- .../templates/shared/activity_container.html | 2 +- app/retail/templates/shared/analytics.html | 2 +- app/retail/templates/shared/cards.html | 2 +- app/retail/templates/shared/favicon.html | 2 +- app/retail/templates/shared/head.html | 2 +- .../templates/shared/shared_scripts.html | 2 +- .../templates/shared/tag_manager_1.html | 2 +- .../templates/shared/what_is_gitcoin.html | 2 +- app/retail/templates/slack.html | 2 +- .../templates/whitepaper_accesscode.html | 2 +- app/retail/templates/whitepaper_new.html | 2 +- app/retail/templatetags/hash.py | 2 +- app/retail/templatetags/is_in_list.py | 2 +- .../templatetags/is_in_list_type_iexact.py | 2 +- app/retail/templatetags/matches.py | 2 +- app/retail/templatetags/strip_char.py | 2 +- app/retail/utils.py | 2 +- app/retail/views.py | 2 +- app/revenue/admin.py | 2 +- app/revenue/models.py | 2 +- app/revenue/utils.py | 2 +- ops/lambdas/welcomebot/app.py | 2 +- scripts/backup.bash | 2 +- scripts/backup_cleansed.bash | 2 +- scripts/bustcache.bash | 2 +- scripts/compress_images.bash | 2 +- scripts/deploy.bash | 2 +- scripts/pg_activity.bash | 2 +- scripts/pg_top.bash | 2 +- scripts/prep_demo.bash | 2 +- scripts/psql.bash | 2 +- scripts/restore_backup.bash | 2 +- scripts/run_management_command.bash | 2 +- ...gement_command_if_not_already_running.bash | 2 +- scripts/sync_external_bounties.bash | 2 +- 392 files changed, 530 insertions(+), 532 deletions(-) diff --git a/app/app/context.py b/app/app/context.py index fdc866a84a4..15af77a3847 100644 --- a/app/app/context.py +++ b/app/app/context.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define additional context data to be passed to any request. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/log_filters.py b/app/app/log_filters.py index 36c670d9237..aed9175f012 100644 --- a/app/app/log_filters.py +++ b/app/app/log_filters.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define custom log filters for Gitcoin logging. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/pipeline.py b/app/app/pipeline.py index 83b8b408c42..1c2051ae33f 100644 --- a/app/app/pipeline.py +++ b/app/app/pipeline.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define authentication pipeline functions and logic. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/settings.py b/app/app/settings.py index 428b000667a..71d36bd39f5 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Gitcoin project settings. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/templates/shared/messages.html b/app/app/templates/shared/messages.html index f1cc256796b..a3e38f582a7 100644 --- a/app/app/templates/shared/messages.html +++ b/app/app/templates/shared/messages.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/templates/shared/rain.html b/app/app/templates/shared/rain.html index 3acc8f66a44..2137aa52887 100644 --- a/app/app/templates/shared/rain.html +++ b/app/app/templates/shared/rain.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/templates/shared/sentry.html b/app/app/templates/shared/sentry.html index 5d12c127c47..7efab7eee9c 100644 --- a/app/app/templates/shared/sentry.html +++ b/app/app/templates/shared/sentry.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/tests/test_app_urls.py b/app/app/tests/test_app_urls.py index 319561786dd..d30d83a39d1 100644 --- a/app/app/tests/test_app_urls.py +++ b/app/app/tests/test_app_urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle app url related tests. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/thumbnail_processors.py b/app/app/thumbnail_processors.py index b4a209c64da..d12dfe3d6c8 100644 --- a/app/app/thumbnail_processors.py +++ b/app/app/thumbnail_processors.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the EthOS thumbnail processors. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/urls.py b/app/app/urls.py index 4ddfd861ee1..df65378beac 100644 --- a/app/app/urls.py +++ b/app/app/urls.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/app/wsgi.py b/app/app/wsgi.py index d2aa67c3d09..ee1f18de131 100644 --- a/app/app/wsgi.py +++ b/app/app/wsgi.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 """Define the application WSGI. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/admin.py b/app/avatar/admin.py index 4daf84e2548..bfd594eb3c9 100644 --- a/app/avatar/admin.py +++ b/app/avatar/admin.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar admin layout. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/apps.py b/app/avatar/apps.py index 3ed4b256f2a..9388cfa446d 100644 --- a/app/avatar/apps.py +++ b/app/avatar/apps.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar application configuration. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/models.py b/app/avatar/models.py index 347431f7716..62c6f6a01db 100644 --- a/app/avatar/models.py +++ b/app/avatar/models.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar models. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/templatetags/avatar_tags.py b/app/avatar/templatetags/avatar_tags.py index 7bd1880731e..86bd1178a86 100644 --- a/app/avatar/templatetags/avatar_tags.py +++ b/app/avatar/templatetags/avatar_tags.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar template tags. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/urls.py b/app/avatar/urls.py index ff747f362b1..f43595517af 100644 --- a/app/avatar/urls.py +++ b/app/avatar/urls.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle avatar URLs. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/utils.py b/app/avatar/utils.py index 4d73058cf8f..d222a84e0b1 100644 --- a/app/avatar/utils.py +++ b/app/avatar/utils.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar utilities. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/views.py b/app/avatar/views.py index 5757cbef869..d7e101f8a45 100644 --- a/app/avatar/views.py +++ b/app/avatar/views.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar views. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/avatar/views_3d.py b/app/avatar/views_3d.py index 5a566d3bf01..eb578da2eea 100644 --- a/app/avatar/views_3d.py +++ b/app/avatar/views_3d.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Avatar views. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/admin.py b/app/bounty_requests/admin.py index dc68890cfc3..d6da9caf0f8 100644 --- a/app/bounty_requests/admin.py +++ b/app/bounty_requests/admin.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define admin related functionality for Bounty Requests. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/forms.py b/app/bounty_requests/forms.py index e38e5370367..f0043cad330 100644 --- a/app/bounty_requests/forms.py +++ b/app/bounty_requests/forms.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define bounty request related forms. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/management/commands/bounty_requests_email.py b/app/bounty_requests/management/commands/bounty_requests_email.py index 00e94ad4e76..99eca224e36 100644 --- a/app/bounty_requests/management/commands/bounty_requests_email.py +++ b/app/bounty_requests/management/commands/bounty_requests_email.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/models.py b/app/bounty_requests/models.py index 1017acb8a82..d66de423afa 100644 --- a/app/bounty_requests/models.py +++ b/app/bounty_requests/models.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define bounty requests related models. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/templates/bounty_request_form.html b/app/bounty_requests/templates/bounty_request_form.html index f4481deea9e..13f47a88e64 100644 --- a/app/bounty_requests/templates/bounty_request_form.html +++ b/app/bounty_requests/templates/bounty_request_form.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/bounty_requests/views.py b/app/bounty_requests/views.py index c4c7078f682..1295c655d31 100644 --- a/app/bounty_requests/views.py +++ b/app/bounty_requests/views.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define bounty request views. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/chat/views.py b/app/chat/views.py index 1361302c41a..32ca22de09c 100644 --- a/app/chat/views.py +++ b/app/chat/views.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define view for the inbox app. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/apps.py b/app/dashboard/apps.py index 78f3112c66d..90b62d32748 100644 --- a/app/dashboard/apps.py +++ b/app/dashboard/apps.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define the Dashboard application configuration. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/helpers.py b/app/dashboard/helpers.py index ec77acfee14..a21b99db3af 100644 --- a/app/dashboard/helpers.py +++ b/app/dashboard/helpers.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle dashboard helpers and related logic. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/calc_profile.py b/app/dashboard/management/commands/calc_profile.py index cb539dfade6..bae112c8930 100644 --- a/app/dashboard/management/commands/calc_profile.py +++ b/app/dashboard/management/commands/calc_profile.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/create_activity_records.py b/app/dashboard/management/commands/create_activity_records.py index 3275d7d7e99..c661b23efbf 100644 --- a/app/dashboard/management/commands/create_activity_records.py +++ b/app/dashboard/management/commands/create_activity_records.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/create_earnings.py b/app/dashboard/management/commands/create_earnings.py index 0345d04800f..0b4ef794fde 100644 --- a/app/dashboard/management/commands/create_earnings.py +++ b/app/dashboard/management/commands/create_earnings.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/create_pagerank.py b/app/dashboard/management/commands/create_pagerank.py index debdc610314..18623c9e40b 100644 --- a/app/dashboard/management/commands/create_pagerank.py +++ b/app/dashboard/management/commands/create_pagerank.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/migrate_profiles.py b/app/dashboard/management/commands/migrate_profiles.py index 33904911b60..fd2a35f2edb 100644 --- a/app/dashboard/management/commands/migrate_profiles.py +++ b/app/dashboard/management/commands/migrate_profiles.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/send_tips_for_bounty_fulfiller.py b/app/dashboard/management/commands/send_tips_for_bounty_fulfiller.py index dec51d3f5d5..190656ecf69 100644 --- a/app/dashboard/management/commands/send_tips_for_bounty_fulfiller.py +++ b/app/dashboard/management/commands/send_tips_for_bounty_fulfiller.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle marketing commands related tests. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/setup_grants_clr_3.py b/app/dashboard/management/commands/setup_grants_clr_3.py index 2df4c31f1bf..650ca4bc7c0 100644 --- a/app/dashboard/management/commands/setup_grants_clr_3.py +++ b/app/dashboard/management/commands/setup_grants_clr_3.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/management/commands/sync_listener.py b/app/dashboard/management/commands/sync_listener.py index 3b757c3dcdd..dfe0752d858 100644 --- a/app/dashboard/management/commands/sync_listener.py +++ b/app/dashboard/management/commands/sync_listener.py @@ -1,5 +1,5 @@ ''' - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/notifications.py b/app/dashboard/notifications.py index 8867f808016..508a64798bd 100644 --- a/app/dashboard/notifications.py +++ b/app/dashboard/notifications.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle dashboard related notifications. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/router.py b/app/dashboard/router.py index 2bb36d39091..4be98eef3fe 100644 --- a/app/dashboard/router.py +++ b/app/dashboard/router.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Define dashboard specific DRF API routes. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/signals.py b/app/dashboard/signals.py index 1b94a572760..5265648fcbd 100644 --- a/app/dashboard/signals.py +++ b/app/dashboard/signals.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Handle dashboard related signals. -Copyright (C) 2018 Gitcoin Core +Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/addinterest.html b/app/dashboard/templates/addinterest.html index 8bca8bba2ab..787661249ef 100644 --- a/app/dashboard/templates/addinterest.html +++ b/app/dashboard/templates/addinterest.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/bounty/change.html b/app/dashboard/templates/bounty/change.html index 66b07edad80..1340d4808d9 100644 --- a/app/dashboard/templates/bounty/change.html +++ b/app/dashboard/templates/bounty/change.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/bounty/fulfill.html b/app/dashboard/templates/bounty/fulfill.html index 1589829c662..06d531aebae 100644 --- a/app/dashboard/templates/bounty/fulfill.html +++ b/app/dashboard/templates/bounty/fulfill.html @@ -53,7 +53,7 @@

    {% trans "Submit Work" %}

    - +
    {% include 'shared/github_username.html' %} diff --git a/app/dashboard/templates/bounty/fund.html b/app/dashboard/templates/bounty/fund.html index ee93a8c8a99..60039080f6a 100644 --- a/app/dashboard/templates/bounty/fund.html +++ b/app/dashboard/templates/bounty/fund.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -77,7 +77,7 @@
    Important Notes on Private Repo
    - +

    {% trans "Last Synced " %}

    diff --git a/app/dashboard/templates/bounty/process_refund_request.html b/app/dashboard/templates/bounty/process_refund_request.html index 653873b2e05..87272fedbde 100644 --- a/app/dashboard/templates/bounty/process_refund_request.html +++ b/app/dashboard/templates/bounty/process_refund_request.html @@ -1,6 +1,6 @@ {% extends "admin/base_site.html" %} {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/bulk_payout_bounty.html b/app/dashboard/templates/bulk_payout_bounty.html index f8a5c096a1b..4dd96a43c8d 100644 --- a/app/dashboard/templates/bulk_payout_bounty.html +++ b/app/dashboard/templates/bulk_payout_bounty.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/dashboard/ftux.html b/app/dashboard/templates/dashboard/ftux.html index bd9222802aa..c14d530332b 100644 --- a/app/dashboard/templates/dashboard/ftux.html +++ b/app/dashboard/templates/dashboard/ftux.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/dashboard/hackathon/onboard.html b/app/dashboard/templates/dashboard/hackathon/onboard.html index fbba7e17329..903f66df397 100644 --- a/app/dashboard/templates/dashboard/hackathon/onboard.html +++ b/app/dashboard/templates/dashboard/hackathon/onboard.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/dashboard/hackathon/projects.html b/app/dashboard/templates/dashboard/hackathon/projects.html index d229684dbe1..e74e8afdc54 100644 --- a/app/dashboard/templates/dashboard/hackathon/projects.html +++ b/app/dashboard/templates/dashboard/hackathon/projects.html @@ -128,7 +128,7 @@

    {{hackathon.name}} Projects

    diff --git a/app/dashboard/templates/dashboard/sidebar_search.html b/app/dashboard/templates/dashboard/sidebar_search.html index 09429e96dae..39b8be28e81 100644 --- a/app/dashboard/templates/dashboard/sidebar_search.html +++ b/app/dashboard/templates/dashboard/sidebar_search.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/dashboard/sidebar_search_hackathon.html b/app/dashboard/templates/dashboard/sidebar_search_hackathon.html index e2b04fb8671..d864c42bbeb 100644 --- a/app/dashboard/templates/dashboard/sidebar_search_hackathon.html +++ b/app/dashboard/templates/dashboard/sidebar_search_hackathon.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/extend_issue_deadline.html b/app/dashboard/templates/extend_issue_deadline.html index 29b844bbd09..536a89f10a6 100644 --- a/app/dashboard/templates/extend_issue_deadline.html +++ b/app/dashboard/templates/extend_issue_deadline.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/ftux/avatar.html b/app/dashboard/templates/ftux/avatar.html index 4c07c8fe389..a62780a3ea9 100644 --- a/app/dashboard/templates/ftux/avatar.html +++ b/app/dashboard/templates/ftux/avatar.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -193,9 +193,12 @@

    {% for category, ids in 3d_avatar_params.by_category.items %} -
    +
    {% for id in ids %} - + {% endfor %}
    {% endfor %} diff --git a/app/dashboard/templates/ftux/github.html b/app/dashboard/templates/ftux/github.html index 351b2e09f8b..99a0fee45f5 100644 --- a/app/dashboard/templates/ftux/github.html +++ b/app/dashboard/templates/ftux/github.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/ftux/job.html b/app/dashboard/templates/ftux/job.html index dda3cc17103..938ef4b628d 100644 --- a/app/dashboard/templates/ftux/job.html +++ b/app/dashboard/templates/ftux/job.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/ftux/metamask.html b/app/dashboard/templates/ftux/metamask.html index 88530beb127..525dbc81b60 100644 --- a/app/dashboard/templates/ftux/metamask.html +++ b/app/dashboard/templates/ftux/metamask.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/ftux/onboard.html b/app/dashboard/templates/ftux/onboard.html index 33ffc30d30a..beb70934a3e 100644 --- a/app/dashboard/templates/ftux/onboard.html +++ b/app/dashboard/templates/ftux/onboard.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/ftux/skills.html b/app/dashboard/templates/ftux/skills.html index e568a6bea98..e682f1541e7 100644 --- a/app/dashboard/templates/ftux/skills.html +++ b/app/dashboard/templates/ftux/skills.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/funder_payout_reminder_modal.html b/app/dashboard/templates/funder_payout_reminder_modal.html index 4170d57b721..8410236d379 100644 --- a/app/dashboard/templates/funder_payout_reminder_modal.html +++ b/app/dashboard/templates/funder_payout_reminder_modal.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/labs.html b/app/dashboard/templates/labs.html index 618b4ee8475..fcbde59089e 100644 --- a/app/dashboard/templates/labs.html +++ b/app/dashboard/templates/labs.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/legal/terms.html b/app/dashboard/templates/legal/terms.html index fbb550dfc88..841ebb9b6d6 100644 --- a/app/dashboard/templates/legal/terms.html +++ b/app/dashboard/templates/legal/terms.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/notifyfunder.html b/app/dashboard/templates/notifyfunder.html index 55ce62706ac..db5413fac72 100644 --- a/app/dashboard/templates/notifyfunder.html +++ b/app/dashboard/templates/notifyfunder.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/onepager/base.html b/app/dashboard/templates/onepager/base.html index 2590ea93bb8..ab43e0dc376 100644 --- a/app/dashboard/templates/onepager/base.html +++ b/app/dashboard/templates/onepager/base.html @@ -1,5 +1,5 @@ {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published diff --git a/app/dashboard/templates/onepager/receive.html b/app/dashboard/templates/onepager/receive.html index 459fb503b92..27d2200ba2b 100644 --- a/app/dashboard/templates/onepager/receive.html +++ b/app/dashboard/templates/onepager/receive.html @@ -1,6 +1,6 @@ {% extends 'onepager/base.html' %} {% comment %} - Copyright (C) 2018 Gitcoin Core + Copyright (C) 2020 Gitcoin Core This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -42,17 +42,17 @@ -