From 27a8a949e6ef71b3ba6ecee27b447646909d491b Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 17:21:11 +0000 Subject: [PATCH 01/14] Add new app for learning Python --- apps/learn/__init__.py | 0 apps/learn/admin.py | 3 +++ apps/learn/apps.py | 6 ++++++ apps/learn/migrations/__init__.py | 0 apps/learn/models.py | 3 +++ apps/learn/tests.py | 3 +++ apps/learn/views.py | 3 +++ main/settings.py | 1 + 8 files changed, 19 insertions(+) create mode 100644 apps/learn/__init__.py create mode 100644 apps/learn/admin.py create mode 100644 apps/learn/apps.py create mode 100644 apps/learn/migrations/__init__.py create mode 100644 apps/learn/models.py create mode 100644 apps/learn/tests.py create mode 100644 apps/learn/views.py diff --git a/apps/learn/__init__.py b/apps/learn/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/learn/admin.py b/apps/learn/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/learn/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/learn/apps.py b/apps/learn/apps.py new file mode 100644 index 00000000..13768133 --- /dev/null +++ b/apps/learn/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class LearnConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.learn' diff --git a/apps/learn/migrations/__init__.py b/apps/learn/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/learn/models.py b/apps/learn/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/apps/learn/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/learn/tests.py b/apps/learn/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/learn/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/learn/views.py b/apps/learn/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/apps/learn/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/main/settings.py b/main/settings.py index 1ee5c4d0..07aec47b 100644 --- a/main/settings.py +++ b/main/settings.py @@ -80,6 +80,7 @@ 'apps.about', 'apps.legal', 'apps.dev', + 'apps.learn', ] if DEBUG: From 36da949e7726a3fc30b983b2d7ef46de2ed19dc5 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 17:28:06 +0000 Subject: [PATCH 02/14] Add first view to learn app --- apps/learn/urls.py | 9 +++++++++ apps/learn/views.py | 5 +++++ main/urls.py | 1 + 3 files changed, 15 insertions(+) create mode 100644 apps/learn/urls.py diff --git a/apps/learn/urls.py b/apps/learn/urls.py new file mode 100644 index 00000000..12cbd85b --- /dev/null +++ b/apps/learn/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from . import views + +app_name = 'learn' + +urlpatterns = [ + path('', views.index, name='index'), +] diff --git a/apps/learn/views.py b/apps/learn/views.py index 91ea44a2..c6f65e8f 100644 --- a/apps/learn/views.py +++ b/apps/learn/views.py @@ -1,3 +1,8 @@ from django.shortcuts import render + # Create your views here. +def index(request): + from django.http import HttpResponse + + return HttpResponse('Not implemented!') diff --git a/main/urls.py b/main/urls.py index b3b677cd..a098c65b 100644 --- a/main/urls.py +++ b/main/urls.py @@ -17,6 +17,7 @@ path('legal/', include('apps.legal.urls', namespace='legal')), path('members/', include('apps.members.urls', namespace='members')), path('jobs/', include('apps.jobs.urls', namespace='jobs')), + path('learn/', include('apps.learn.urls', namespace='learn')), ] if settings.DEBUG: From 0b668c19b4c7ae9d0d8f7df86f522a0211f48e54 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 18:15:25 +0000 Subject: [PATCH 03/14] Add initial migration for learn app --- apps/learn/migrations/0001_initial.py | 32 +++++++++++++++++++++++++++ apps/learn/models.py | 12 +++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 apps/learn/migrations/0001_initial.py diff --git a/apps/learn/migrations/0001_initial.py b/apps/learn/migrations/0001_initial.py new file mode 100644 index 00000000..61f67657 --- /dev/null +++ b/apps/learn/migrations/0001_initial.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.13 on 2022-06-02 18:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Label', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=120)), + ('slug', models.SlugField(max_length=120, unique=True)), + ], + ), + migrations.CreateModel( + name='Resource', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=120)), + ('slug', models.SlugField(max_length=120, unique=True)), + ('url', models.URLField(max_length=240)), + ('labels', models.ManyToManyField(related_name='resources', to='learn.Label')), + ], + ), + ] diff --git a/apps/learn/models.py b/apps/learn/models.py index 71a83623..632222f0 100644 --- a/apps/learn/models.py +++ b/apps/learn/models.py @@ -1,3 +1,13 @@ from django.db import models -# Create your models here. + +class Label(models.Model): + name = models.CharField(max_length=120) + slug = models.SlugField(max_length=120, unique=True) + + +class Resource(models.Model): + name = models.CharField(max_length=120) + slug = models.SlugField(max_length=120, unique=True) + url = models.URLField(max_length=240) + labels = models.ManyToManyField(to=Label, related_name='resources') From 9e81d335f12d618d8bc08f630ae7e522b7d9d062 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 18:32:47 +0000 Subject: [PATCH 04/14] Add admin classes for learn app --- apps/learn/admin.py | 18 +++++++++++++++++- apps/learn/models.py | 6 ++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/apps/learn/admin.py b/apps/learn/admin.py index 8c38f3f3..82f4ed23 100644 --- a/apps/learn/admin.py +++ b/apps/learn/admin.py @@ -1,3 +1,19 @@ from django.contrib import admin -# Register your models here. +from . import models + + +class LabelAdmin(admin.ModelAdmin): + prepopulated_fields = {'slug': ('name',)} + + +admin.site.register(models.Label, LabelAdmin) + + +class ResourceAdmin(admin.ModelAdmin): + prepopulated_fields = {'slug': ('name',)} + list_display = ('name', 'url') + filter_horizontal = ('labels',) + + +admin.site.register(models.Resource, ResourceAdmin) diff --git a/apps/learn/models.py b/apps/learn/models.py index 632222f0..0c1b51e0 100644 --- a/apps/learn/models.py +++ b/apps/learn/models.py @@ -5,9 +5,15 @@ class Label(models.Model): name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) + def __str__(self): + return self.name + class Resource(models.Model): name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) url = models.URLField(max_length=240) labels = models.ManyToManyField(to=Label, related_name='resources') + + def __str__(self): + return self.name From bea34992ecb1768ae9611c84093432fd23d5c8cd Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 18:52:07 +0000 Subject: [PATCH 05/14] Add default ordering for learn models --- .../migrations/0002_auto_20220602_1951.py | 21 +++++++++++++++++++ apps/learn/models.py | 6 ++++++ 2 files changed, 27 insertions(+) create mode 100644 apps/learn/migrations/0002_auto_20220602_1951.py diff --git a/apps/learn/migrations/0002_auto_20220602_1951.py b/apps/learn/migrations/0002_auto_20220602_1951.py new file mode 100644 index 00000000..012ea800 --- /dev/null +++ b/apps/learn/migrations/0002_auto_20220602_1951.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.13 on 2022-06-02 18:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('learn', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='label', + options={'ordering': ['name']}, + ), + migrations.AlterModelOptions( + name='resource', + options={'ordering': ['name']}, + ), + ] diff --git a/apps/learn/models.py b/apps/learn/models.py index 0c1b51e0..fb02fe05 100644 --- a/apps/learn/models.py +++ b/apps/learn/models.py @@ -2,6 +2,9 @@ class Label(models.Model): + class Meta: + ordering = ['name'] + name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) @@ -10,6 +13,9 @@ def __str__(self): class Resource(models.Model): + class Meta: + ordering = ['name'] + name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) url = models.URLField(max_length=240) From d3a9920db55d45a300ed75a3bb3682bc6f219642 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 2 Jun 2022 18:52:21 +0000 Subject: [PATCH 06/14] Add templates for learn app --- apps/learn/templates/learn/base.html | 11 +++++++++++ apps/learn/templates/learn/index.html | 19 +++++++++++++++++++ apps/learn/views.py | 8 ++++---- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 apps/learn/templates/learn/base.html create mode 100644 apps/learn/templates/learn/index.html diff --git a/apps/learn/templates/learn/base.html b/apps/learn/templates/learn/base.html new file mode 100644 index 00000000..8a242477 --- /dev/null +++ b/apps/learn/templates/learn/base.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% load utils %} + +{% block style %} + +{% endblock style %} + +{% block js %} + +{% endblock js %} diff --git a/apps/learn/templates/learn/index.html b/apps/learn/templates/learn/index.html new file mode 100644 index 00000000..72983881 --- /dev/null +++ b/apps/learn/templates/learn/index.html @@ -0,0 +1,19 @@ +{% extends "jobs/base.html" %} + +{% load utils %} + +{% block title %}Aprende Python - {{ block.super }}{% endblock %} + +{% block body_class %}learn-index{% endblock %} + +{% block content %} + +

Aprende Python

+ +
    + {% for label in labels %} +
  • {{ label }}
  • + {% endfor %} +
+ +{% endblock content %} diff --git a/apps/learn/views.py b/apps/learn/views.py index c6f65e8f..889e2cac 100644 --- a/apps/learn/views.py +++ b/apps/learn/views.py @@ -1,8 +1,8 @@ from django.shortcuts import render +from .models import Label -# Create your views here. -def index(request): - from django.http import HttpResponse - return HttpResponse('Not implemented!') +def index(request): + labels = Label.objects.all() + return render(request, 'learn/index.html', {'labels': labels}) From e3f5797ad83031b619bbe5e0376c0c37a933dbc6 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 18:15:19 +0000 Subject: [PATCH 07/14] Add label converter for urls --- apps/learn/converters.py | 16 ++++++++++++++++ apps/learn/templates/learn/index.html | 2 +- .../templates/learn/resources_by_label.html | 19 +++++++++++++++++++ apps/learn/urls.py | 10 +++++++++- apps/learn/views.py | 8 ++++++++ 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 apps/learn/converters.py create mode 100644 apps/learn/templates/learn/resources_by_label.html diff --git a/apps/learn/converters.py b/apps/learn/converters.py new file mode 100644 index 00000000..12e70408 --- /dev/null +++ b/apps/learn/converters.py @@ -0,0 +1,16 @@ +from django.core.exceptions import ObjectDoesNotExist + +from .models import Label + + +class LabelConverter: + regex = '[-a-zA-Z0-9_]+' + + def to_python(self, value: str) -> Label: + try: + return Label.objects.get(slug=value) + except ObjectDoesNotExist as err: + raise ValueError('This label does not exist!') from err + + def to_url(self, value: Label) -> str: + return value.slug diff --git a/apps/learn/templates/learn/index.html b/apps/learn/templates/learn/index.html index 72983881..71ee7222 100644 --- a/apps/learn/templates/learn/index.html +++ b/apps/learn/templates/learn/index.html @@ -12,7 +12,7 @@

Aprende Python

    {% for label in labels %} -
  • {{ label }}
  • +
  • {{ label }}
  • {% endfor %}
diff --git a/apps/learn/templates/learn/resources_by_label.html b/apps/learn/templates/learn/resources_by_label.html new file mode 100644 index 00000000..3194de0e --- /dev/null +++ b/apps/learn/templates/learn/resources_by_label.html @@ -0,0 +1,19 @@ +{% extends "jobs/base.html" %} + +{% load utils %} + +{% block title %}Aprende Python - {{ block.super }}{% endblock %} + +{% block body_class %}learn-resources_by_label{% endblock %} + +{% block content %} + +

{{ label }}

+ + + +{% endblock content %} diff --git a/apps/learn/urls.py b/apps/learn/urls.py index 12cbd85b..08a1ade6 100644 --- a/apps/learn/urls.py +++ b/apps/learn/urls.py @@ -1,9 +1,17 @@ -from django.urls import path +from django.urls import path, register_converter from . import views +from .converters import LabelConverter app_name = 'learn' +register_converter(LabelConverter, 'label') + urlpatterns = [ path('', views.index, name='index'), + path( + 'labels//', + views.resources_by_label, + name='resources_by_label', + ), ] diff --git a/apps/learn/views.py b/apps/learn/views.py index 889e2cac..46c790f3 100644 --- a/apps/learn/views.py +++ b/apps/learn/views.py @@ -6,3 +6,11 @@ def index(request): labels = Label.objects.all() return render(request, 'learn/index.html', {'labels': labels}) + + +def resources_by_label(request, label): + return render( + request, + 'learn/resources_by_label.html', + {'label': label, 'resources': label.resources.all()}, + ) From ecfdde74da54e124aa8ad722519fdbc33c6ad413 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 18:35:23 +0000 Subject: [PATCH 08/14] Add labels to learning resources --- apps/learn/templates/learn/resources_by_label.html | 7 ++++++- apps/learn/views.py | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/learn/templates/learn/resources_by_label.html b/apps/learn/templates/learn/resources_by_label.html index 3194de0e..8ea7d2cc 100644 --- a/apps/learn/templates/learn/resources_by_label.html +++ b/apps/learn/templates/learn/resources_by_label.html @@ -12,7 +12,12 @@

{{ label }}

diff --git a/apps/learn/views.py b/apps/learn/views.py index 46c790f3..3b587bc2 100644 --- a/apps/learn/views.py +++ b/apps/learn/views.py @@ -9,8 +9,9 @@ def index(request): def resources_by_label(request, label): + resources = label.resources.prefetch_related('labels').all() return render( request, 'learn/resources_by_label.html', - {'label': label, 'resources': label.resources.all()}, + {'label': label, 'resources': resources}, ) From 2953deff59be905c9ca313ee2e7befdb4cef3081 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 19:39:22 +0000 Subject: [PATCH 09/14] Add color to learning labels --- apps/learn/colors.py | 18 ++++++++++++++++++ apps/learn/migrations/0003_label_color.py | 18 ++++++++++++++++++ apps/learn/models.py | 10 ++++++++++ apps/learn/templates/learn/base.html | 4 ---- apps/learn/templates/learn/index.html | 2 ++ .../templates/learn/resources_by_label.html | 12 +++++++++++- 6 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 apps/learn/colors.py create mode 100644 apps/learn/migrations/0003_label_color.py diff --git a/apps/learn/colors.py b/apps/learn/colors.py new file mode 100644 index 00000000..ad3ddcc6 --- /dev/null +++ b/apps/learn/colors.py @@ -0,0 +1,18 @@ +from typing import Tuple + +BLACK = '000000' +WHITE = 'FFFFFF' + + +def get_rgb_from_hex(value: str) -> Tuple[int, int, int, int]: + red = int(value[:2], base=16) + green = int(value[2:4], base=16) + blue = int(value[4:6], base=16) + alpha = int(value[6:8], base=16) if len(value) > 6 else 255 + return red, green, blue, alpha + + +def get_luminance(red, green, blue, alpha) -> int: + luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue + luminance *= alpha / 255 + return round(luminance) diff --git a/apps/learn/migrations/0003_label_color.py b/apps/learn/migrations/0003_label_color.py new file mode 100644 index 00000000..dd847422 --- /dev/null +++ b/apps/learn/migrations/0003_label_color.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2022-06-22 18:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('learn', '0002_auto_20220602_1951'), + ] + + operations = [ + migrations.AddField( + model_name='label', + name='color', + field=models.CharField(default='FF0000', max_length=8), + ), + ] diff --git a/apps/learn/models.py b/apps/learn/models.py index fb02fe05..cc496bf6 100644 --- a/apps/learn/models.py +++ b/apps/learn/models.py @@ -1,5 +1,7 @@ from django.db import models +from . import colors + class Label(models.Model): class Meta: @@ -7,10 +9,18 @@ class Meta: name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) + # Label color in hex mode + color = models.CharField(max_length=8, default='FF0000') def __str__(self): return self.name + @property + def foreground_color(self): + rgb_color = colors.get_rgb_from_hex(self.color) + luminance = colors.get_luminance(*rgb_color) + return colors.BLACK if luminance > 128 else colors.WHITE + class Resource(models.Model): class Meta: diff --git a/apps/learn/templates/learn/base.html b/apps/learn/templates/learn/base.html index 8a242477..a41e273c 100644 --- a/apps/learn/templates/learn/base.html +++ b/apps/learn/templates/learn/base.html @@ -5,7 +5,3 @@ {% block style %} {% endblock style %} - -{% block js %} - -{% endblock js %} diff --git a/apps/learn/templates/learn/index.html b/apps/learn/templates/learn/index.html index 71ee7222..48d58ef5 100644 --- a/apps/learn/templates/learn/index.html +++ b/apps/learn/templates/learn/index.html @@ -10,6 +10,8 @@

Aprende Python

+

En esta sección podrás encontrar recursos de aprendizaje Python.

+
    {% for label in labels %}
  • {{ label }}
  • diff --git a/apps/learn/templates/learn/resources_by_label.html b/apps/learn/templates/learn/resources_by_label.html index 8ea7d2cc..0f18119f 100644 --- a/apps/learn/templates/learn/resources_by_label.html +++ b/apps/learn/templates/learn/resources_by_label.html @@ -8,6 +8,14 @@ {% block content %} + +

    {{ label }}

      @@ -15,7 +23,9 @@

      {{ label }}

    • {{ resource }} {% for label in resource.labels.all %} - {{ label }} + + {{ label }} + {% endfor %}
    • {% endfor %} From 2172da5979ebfc8241697161a8dd791482e3056d Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 19:39:46 +0000 Subject: [PATCH 10/14] Add menu link to reach learning section --- apps/commons/templates/header.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/commons/templates/header.html b/apps/commons/templates/header.html index 7e4c115d..c0956596 100644 --- a/apps/commons/templates/header.html +++ b/apps/commons/templates/header.html @@ -44,6 +44,11 @@ Empleo + + + Aprende + + {% if request.user.is_authenticated %} From 2c3024b52dc2c2abb348be5c81a097b144293f17 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 21:44:52 +0000 Subject: [PATCH 11/14] Add custom styles to labels on learning resources --- apps/learn/static/learn/css/main.scss | 44 +++++++++++++++++++ apps/learn/templates/learn/index.html | 10 +++-- .../templates/learn/resources_by_label.html | 11 +++-- gulp/config.js | 43 +++++++++--------- 4 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 apps/learn/static/learn/css/main.scss diff --git a/apps/learn/static/learn/css/main.scss b/apps/learn/static/learn/css/main.scss new file mode 100644 index 00000000..33d3f4e8 --- /dev/null +++ b/apps/learn/static/learn/css/main.scss @@ -0,0 +1,44 @@ +@import 'apps/commons/static/commons/css/base'; + +ul { + margin-top: 1rem; + + &.resources { + li { + list-style: initial; + margin-left: 20px; + } + } + + .label { + display: inline-block; + font-size: 13px; + padding-left: 9px; + padding-right: 9px; + border-radius: 10px; + + &:hover { + background-color: #154360 !important; + a { + color: white !important; + } + } + } +} + +.learn-index { + ul li i { + padding-right: 10px; + } + + .label { + font-size: 1rem; + margin-bottom: 0.5rem; + } +} + +.learn-resources_by_label { + .resource { + margin-right: 1rem; + } +} diff --git a/apps/learn/templates/learn/index.html b/apps/learn/templates/learn/index.html index 48d58ef5..593d1a9d 100644 --- a/apps/learn/templates/learn/index.html +++ b/apps/learn/templates/learn/index.html @@ -1,4 +1,4 @@ -{% extends "jobs/base.html" %} +{% extends "learn/base.html" %} {% load utils %} @@ -10,11 +10,15 @@

      Aprende Python

      -

      En esta sección podrás encontrar recursos de aprendizaje Python.

      +

      En esta sección podrás encontrar recursos de aprendizaje Python. Están clasificados por etiquetas:

      diff --git a/apps/learn/templates/learn/resources_by_label.html b/apps/learn/templates/learn/resources_by_label.html index 0f18119f..5887ecbb 100644 --- a/apps/learn/templates/learn/resources_by_label.html +++ b/apps/learn/templates/learn/resources_by_label.html @@ -1,4 +1,4 @@ -{% extends "jobs/base.html" %} +{% extends "learn/base.html" %} {% load utils %} @@ -10,20 +10,19 @@ -

      {{ label }}

      +

      {{ label }}

      -
        +
          {% for resource in resources %}
        • - {{ resource }} + {{ resource }} {% for label in resource.labels.all %} - + {{ label }} {% endfor %} diff --git a/gulp/config.js b/gulp/config.js index 482eb8a9..aa140a9d 100644 --- a/gulp/config.js +++ b/gulp/config.js @@ -1,35 +1,32 @@ -import path from 'path'; +import path from 'path' - -function getNodeModulesPathFrom(module_name) -{ - let module_path = require.resolve(module_name); - while(module_path !== '/' && path.basename(module_path) !== "node_modules") - { - module_path = path.dirname(module_path); +function getNodeModulesPathFrom(module_name) { + let module_path = require.resolve(module_name) + while (module_path !== '/' && path.basename(module_path) !== 'node_modules') { + module_path = path.dirname(module_path) } - return module_path; + return module_path } - const APPS = [ - "commons", - "events", - "homepage", - "about", - "legal", - "members", - "jobs", -]; + 'commons', + 'events', + 'homepage', + 'about', + 'legal', + 'members', + 'jobs', + 'learn', +] -const NODE_MODULES_DIR = getNodeModulesPathFrom('@fortawesome/fontawesome-free'); +const NODE_MODULES_DIR = getNodeModulesPathFrom('@fortawesome/fontawesome-free') const LIBS = { CSS: { - commons: [NODE_MODULES_DIR + "/@fortawesome/fontawesome-free/css/all.css"], - homepage: ["apps/homepage/static/homepage/css/vendor.scss"], + commons: [NODE_MODULES_DIR + '/@fortawesome/fontawesome-free/css/all.css'], + homepage: ['apps/homepage/static/homepage/css/vendor.scss'], }, JS: {}, -}; +} -export { APPS, LIBS, NODE_MODULES_DIR }; +export { APPS, LIBS, NODE_MODULES_DIR } From b704759308825843177722affda64e14fe4ad29b Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Wed, 22 Jun 2022 22:01:01 +0000 Subject: [PATCH 12/14] Add number of resources per label --- apps/learn/static/learn/css/main.scss | 52 +++++++++++-------- apps/learn/templates/learn/index.html | 9 ++-- .../templates/learn/resources_by_label.html | 8 +-- apps/learn/views.py | 2 +- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/apps/learn/static/learn/css/main.scss b/apps/learn/static/learn/css/main.scss index 33d3f4e8..bc784499 100644 --- a/apps/learn/static/learn/css/main.scss +++ b/apps/learn/static/learn/css/main.scss @@ -1,31 +1,34 @@ @import 'apps/commons/static/commons/css/base'; -ul { - margin-top: 1rem; +a.label { + display: inline-block; + font-size: 13px; + padding-top: 3px; + padding-bottom: 3px; + padding-left: 9px; + padding-right: 9px; + border-radius: 10px; - &.resources { - li { - list-style: initial; - margin-left: 20px; - } + &:hover { + background-color: #154360 !important; + color: white !important; } - .label { - display: inline-block; - font-size: 13px; - padding-left: 9px; - padding-right: 9px; - border-radius: 10px; - - &:hover { - background-color: #154360 !important; - a { - color: white !important; - } - } + span.badge { + background-color: rgba(255, 255, 255, 0.518); + margin-left: 3px; + border-radius: 12px; + padding-top: 2px; + padding-bottom: 2px; + padding-left: 3px; + padding-right: 3px; } } +ul { + margin-top: 1rem; +} + .learn-index { ul li i { padding-right: 10px; @@ -38,7 +41,14 @@ ul { } .learn-resources_by_label { - .resource { + a.resource { margin-right: 1rem; } + + ul.resources { + li { + list-style: initial; + margin-left: 20px; + } + } } diff --git a/apps/learn/templates/learn/index.html b/apps/learn/templates/learn/index.html index 593d1a9d..20518377 100644 --- a/apps/learn/templates/learn/index.html +++ b/apps/learn/templates/learn/index.html @@ -15,9 +15,12 @@

          Aprende Python

          diff --git a/apps/learn/templates/learn/resources_by_label.html b/apps/learn/templates/learn/resources_by_label.html index 5887ecbb..9fcdc603 100644 --- a/apps/learn/templates/learn/resources_by_label.html +++ b/apps/learn/templates/learn/resources_by_label.html @@ -22,9 +22,11 @@

          {{ label }}

        • {{ resource }} {% for label in resource.labels.all %} - - {{ label }} - + + {{ label }} + {% endfor %}
        • {% endfor %} diff --git a/apps/learn/views.py b/apps/learn/views.py index 3b587bc2..5296bdb2 100644 --- a/apps/learn/views.py +++ b/apps/learn/views.py @@ -4,7 +4,7 @@ def index(request): - labels = Label.objects.all() + labels = Label.objects.prefetch_related('resources').all() return render(request, 'learn/index.html', {'labels': labels}) From b82cc192a3ede2a694c8962dbf6053bf84a8ecfa Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 23 Jun 2022 07:57:47 +0000 Subject: [PATCH 13/14] Add random color when saving label --- apps/learn/colors.py | 9 +++++++++ apps/learn/models.py | 10 +++++++++- apps/learn/static/learn/css/main.scss | 5 +++-- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/apps/learn/colors.py b/apps/learn/colors.py index ad3ddcc6..8634f6e0 100644 --- a/apps/learn/colors.py +++ b/apps/learn/colors.py @@ -1,3 +1,5 @@ +import random +import string from typing import Tuple BLACK = '000000' @@ -16,3 +18,10 @@ def get_luminance(red, green, blue, alpha) -> int: luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue luminance *= alpha / 255 return round(luminance) + + +def get_random_hex_color(include_alpha=False): + size = 8 if include_alpha else 6 + return ''.join( + random.choice(string.hexdigits.upper()) for _ in range(size) + ) diff --git a/apps/learn/models.py b/apps/learn/models.py index cc496bf6..4d82a3dc 100644 --- a/apps/learn/models.py +++ b/apps/learn/models.py @@ -1,3 +1,5 @@ +import re + from django.db import models from . import colors @@ -10,7 +12,9 @@ class Meta: name = models.CharField(max_length=120) slug = models.SlugField(max_length=120, unique=True) # Label color in hex mode - color = models.CharField(max_length=8, default='FF0000') + color = models.CharField( + max_length=8, default=colors.get_random_hex_color() + ) def __str__(self): return self.name @@ -21,6 +25,10 @@ def foreground_color(self): luminance = colors.get_luminance(*rgb_color) return colors.BLACK if luminance > 128 else colors.WHITE + def save(self, *args, **kwargs): + self.color = re.sub(r'^#', '', self.color) + super().save(*args, **kwargs) + class Resource(models.Model): class Meta: diff --git a/apps/learn/static/learn/css/main.scss b/apps/learn/static/learn/css/main.scss index bc784499..54c0386a 100644 --- a/apps/learn/static/learn/css/main.scss +++ b/apps/learn/static/learn/css/main.scss @@ -20,8 +20,9 @@ a.label { border-radius: 12px; padding-top: 2px; padding-bottom: 2px; - padding-left: 3px; - padding-right: 3px; + padding-left: 4px; + padding-right: 4px; + font-size: 12px; } } From 94dbebb9c9fcacbcd509a451e7ab5447fee4e3a6 Mon Sep 17 00:00:00 2001 From: Sergio Delgado Quintero Date: Thu, 23 Jun 2022 08:03:58 +0000 Subject: [PATCH 14/14] Add pending migration for learning resources --- .../learn/migrations/0004_alter_label_color.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 apps/learn/migrations/0004_alter_label_color.py diff --git a/apps/learn/migrations/0004_alter_label_color.py b/apps/learn/migrations/0004_alter_label_color.py new file mode 100644 index 00000000..8ab7ec25 --- /dev/null +++ b/apps/learn/migrations/0004_alter_label_color.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.13 on 2022-06-23 08:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('learn', '0003_label_color'), + ] + + operations = [ + migrations.AlterField( + model_name='label', + name='color', + field=models.CharField(default='EEBDDE', max_length=8), + ), + ]