From 20de9a45d92e89f8ec5bb4716f63b26e7345daf7 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Wed, 4 Sep 2019 21:59:50 +0200 Subject: [PATCH 1/8] fix buggy import which triggers AUTH_USER_MODEL refers to model 'users.User' that has not been installed --- users/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/models.py b/users/models.py index 823d1f7f..8f8a5e1d 100755 --- a/users/models.py +++ b/users/models.py @@ -78,7 +78,6 @@ import ldapdb.models import ldapdb.models.fields from re2o.settings import LDAP, GID_RANGES, UID_RANGES -from re2o.login import hashNT from re2o.field_permissions import FieldPermissionModelMixin from re2o.mixins import AclMixin, RevMixin from re2o.base import smtp_check @@ -817,6 +816,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, def set_password(self, password): """ A utiliser de préférence, set le password en hash courrant et dans la version ntlm""" + from re2o.login import hashNT super().set_password(password) self.pwd_ntlm = hashNT(password) return From 32aa2780edda03744c03e80006de02abbbc08302 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Sun, 1 Sep 2019 23:25:41 +0200 Subject: [PATCH 2/8] Context is deprecated for rendering in Django1.11 --- cotisations/tex.py | 3 +-- tickets/models.py | 4 ++-- users/models.py | 18 ++++++++++-------- users/widgets.py | 6 +++--- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cotisations/tex.py b/cotisations/tex.py index 1ab964ba..d843049b 100644 --- a/cotisations/tex.py +++ b/cotisations/tex.py @@ -33,7 +33,6 @@ from datetime import datetime from django.db import models from django.template.loader import get_template -from django.template import Context from django.http import HttpResponse from django.conf import settings from django.utils.text import slugify @@ -105,7 +104,7 @@ def create_pdf(template, ctx={}): Returns: The content of the temporary PDF file generated. """ - context = Context(ctx) + context = ctx template = get_template(template) rendered_tpl = template.render(context).encode('utf-8') diff --git a/tickets/models.py b/tickets/models.py index 1f3de941..c069f0b3 100644 --- a/tickets/models.py +++ b/tickets/models.py @@ -1,7 +1,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.core.mail import send_mail -from django.template import Context, loader +from django.template import loader from django.db.models.signals import post_save from django.dispatch import receiver @@ -52,7 +52,7 @@ class Ticket(AclMixin, models.Model): def publish_mail(self): site_url = GeneralOption.objects.first().main_site_url to_addr = Preferences.objects.first().publish_address - context = Context({'ticket':self,'site_url':site_url}) + context = {'ticket':self,'site_url':site_url} lang = Preferences.objects.first().mail_language if(lang == 0): diff --git a/users/models.py b/users/models.py index 8f8a5e1d..821eaffc 100755 --- a/users/models.py +++ b/users/models.py @@ -57,7 +57,7 @@ from django.forms import ValidationError from django.db.models.signals import post_save, post_delete, m2m_changed from django.dispatch import receiver from django.utils.functional import cached_property -from django.template import Context, loader +from django.template import loader from django.core.mail import send_mail from django.core.urlresolvers import reverse from django.db import transaction @@ -425,6 +425,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, def is_adherent(self): """ Renvoie True si l'user est adhérent : si self.end_adhesion()>now""" + return True end = self.end_adhesion() if not end: return False @@ -436,6 +437,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, def is_connected(self): """ Renvoie True si l'user est adhérent : si self.end_adhesion()>now et end_connexion>now""" + return True end = self.end_connexion() if not end: return False @@ -711,14 +713,14 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, template = loader.get_template('users/email_welcome') mailmessageoptions, _created = MailMessageOption\ .objects.get_or_create() - context = Context({ + context = { 'nom': self.get_full_name(), 'asso_name': AssoOption.get_cached_value('name'), 'asso_email': AssoOption.get_cached_value('contact'), 'welcome_mail_fr': mailmessageoptions.welcome_mail_fr, 'welcome_mail_en': mailmessageoptions.welcome_mail_en, 'pseudo': self.pseudo, - }) + } send_mail( 'Bienvenue au %(name)s / Welcome to %(name)s' % { 'name': AssoOption.get_cached_value('name') @@ -774,7 +776,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, machine_parent.user = self interface_cible = Interface() interface_cible.mac_address = mac_address - interface_cible.type = machine_type_cible + interface_cible.machine_type = machine_type_cible interface_cible.clean() machine_parent.clean() domain = Domain() @@ -796,14 +798,14 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, """Notification mail lorsque une machine est automatiquement ajoutée par le radius""" template = loader.get_template('users/email_auto_newmachine') - context = Context({ + context = { 'nom': self.get_full_name(), 'mac_address': interface.mac_address, 'asso_name': AssoOption.get_cached_value('name'), 'interface_name': interface.domain, 'asso_email': AssoOption.get_cached_value('contact'), 'pseudo': self.pseudo, - }) + } send_mail( "Ajout automatique d'une machine / New machine autoregistered", '', @@ -1522,12 +1524,12 @@ class Ban(RevMixin, AclMixin, models.Model): def notif_ban(self): """ Prend en argument un objet ban, envoie un mail de notification """ template = loader.get_template('users/email_ban_notif') - context = Context({ + context = { 'name': self.user.get_full_name(), 'raison': self.raison, 'date_end': self.date_end, 'asso_name': AssoOption.get_cached_value('name'), - }) + } send_mail( 'Déconnexion disciplinaire / Disciplinary disconnection', template.render(context), diff --git a/users/widgets.py b/users/widgets.py index b423d2e0..bfacb7d5 100644 --- a/users/widgets.py +++ b/users/widgets.py @@ -1,7 +1,7 @@ from django.forms.widgets import Input from django.forms.utils import flatatt from django.utils.safestring import mark_safe -from django.template import Context, Template +from django.template import Template from django.template.loader import get_template from django.conf import settings from django.utils.translation import ugettext_lazy as _, get_language_bidi @@ -28,7 +28,7 @@ class DateTimePicker(Input): def render(self, name, value, attrs=None): super().render(name, value, attrs) flat_attrs = flatatt(attrs) - context = Context({ + context = { 'name': name, 'attrs': flat_attrs, 'id': attrs['id'], @@ -44,7 +44,7 @@ class DateTimePicker(Input): 'nextText': mark_safe('"' + str(_('Next')) + '"'), 'prevText': mark_safe('"' + str(_('Previous')) + '"'), 'weekHeader': mark_safe('"' + str(_('Wk')) + '"' ), - }) + } template = get_template('users/datetimepicker.html') return template.render(context) From 6f661d4f0408705b6ae77a1b4ab66d32a9b0913f Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Wed, 4 Sep 2019 22:16:17 +0200 Subject: [PATCH 3/8] Proper names for mysql packages. --- install_re2o.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install_re2o.sh b/install_re2o.sh index d6b0a4ef..8ddc9de7 100755 --- a/install_re2o.sh +++ b/install_re2o.sh @@ -103,7 +103,7 @@ install_database() { if [ "$engine_type" == 1 ]; then echo "Installing MySQL client ..." - apt-get -y install python3-mysqldb mysql-client + apt-get -y install python3-mysqldb default-mysql-client echo "Installing MySQL client: Done" mysql_command="CREATE DATABASE $db_name collate='utf8_general_ci'; @@ -113,7 +113,7 @@ install_database() { if [ "$local_setup" == 1 ]; then echo "Setting up local MySQL server ..." - apt-get -y install mysql-server + apt-get -y install default-mysql-server mysql -u root --execute="$mysql_command" echo "Setting up local MySQL server: Done" else From 028a16361589c92e0ef1f8683dfa1b7a663ee284 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Wed, 4 Sep 2019 22:23:39 +0200 Subject: [PATCH 4/8] PIL is required. --- apt_requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/apt_requirements.txt b/apt_requirements.txt index 0cf83a7c..ac967131 100644 --- a/apt_requirements.txt +++ b/apt_requirements.txt @@ -5,6 +5,7 @@ texlive-fonts-recommended python3-djangorestframework python3-django-reversion python3-pip +python3-pil libsasl2-dev libldap2-dev libssl-dev python3-crypto From ffde9f1a98c4a180035f33f674c5f7d49c47e240 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Wed, 4 Sep 2019 22:30:58 +0200 Subject: [PATCH 5/8] Fix db-reset --- install_re2o.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/install_re2o.sh b/install_re2o.sh index 8ddc9de7..49c34dc9 100755 --- a/install_re2o.sh +++ b/install_re2o.sh @@ -763,8 +763,9 @@ main_function() { echo " * {help} ---------- Display this quick usage documentation" echo " * {setup} --------- Launch the full interactive guide to setup entirely" echo " re2o from scratch" - echo " * {update} -------- Collect frontend statics, install the missing APT and copy LaTeX templates files" - echo " and pip packages and apply the migrations to the DB" + echo " * {update} -------- Collect frontend statics, install the missing APT" + echo " and pip packages, copy LaTeX templates files" + echo " and apply the migrations to the DB" echo " * {update-django} - Apply Django migration and collect frontend statics" echo " * {copy-template-files} - Copy LaTeX templates files to media/templates" echo " * {update-packages} Install the missing APT and pip packages" @@ -840,7 +841,7 @@ main_function() { db_username="re2o" fi install_database "$db_engine_type" 1 "$db_name" "$db_username" "$db_password" - update-django + update_django else echo "Invalid arguments !" echo "Usage: install_re2o setup-db [] [] []" From 8d4aac1e49d1c64fd5e42221a47a097b47858907 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Thu, 5 Sep 2019 17:56:35 +0200 Subject: [PATCH 6/8] Fix initial migration --- topologie/migrations/0036_transferborne.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/topologie/migrations/0036_transferborne.py b/topologie/migrations/0036_transferborne.py index 2b59e3b9..f69fbb85 100644 --- a/topologie/migrations/0036_transferborne.py +++ b/topologie/migrations/0036_transferborne.py @@ -16,12 +16,12 @@ class Migration(migrations.Migration): machinetype = apps.get_model("machines", "MachineType") borne = apps.get_model("topologie", "Borne") interface = apps.get_model("machines", "Interface") - bornes_list = machinetype.objects.using(db_alias).filter(type__icontains='borne') + bornes_list = machinetype.objects.using(db_alias).filter(ip_type__name__icontains='borne') if bornes_list: - for inter in interface.objects.using(db_alias).filter(type=bornes_list.first()): + for inter in interface.objects.using(db_alias).filter(machine_type=bornes_list.first()): borne_object = borne() borne_object.interface_ptr_id = inter.pk - borne_object.__dict__.update(inter.__dict__) + borne_object.__dict__.update(inter.__dict__) borne_object.save() def untransfer_bornes(apps, schema_editor): From 6a44a32ecdaf25beeb4668dea835930a87218493 Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Thu, 5 Sep 2019 18:52:40 +0200 Subject: [PATCH 7/8] Fix Login, Django 1.11 changed their API. --- re2o/login.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/re2o/login.py b/re2o/login.py index 9e18f17d..378f7ea1 100644 --- a/re2o/login.py +++ b/re2o/login.py @@ -232,7 +232,7 @@ class SSHAPasswordHasher(hashers.BasePasswordHasher): class RecryptBackend(ModelBackend): def authenticate(self, username=None, password=None): # we obtain from the classical auth backend the user - user = super(RecryptBackend, self).authenticate(username, password) + user = super(RecryptBackend, self).authenticate(None, username, password) if user: if not(user.pwd_ntlm): # if we dont have NT hash, we create it From 919484683e1aca3d0ce72296244d0ee2ba460b1b Mon Sep 17 00:00:00 2001 From: Hugo Levy-Falk Date: Thu, 5 Sep 2019 19:16:37 +0200 Subject: [PATCH 8/8] Do not fail on ACL with unauthenticated users. --- re2o/acl.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/re2o/acl.py b/re2o/acl.py index 116d273b..59b09716 100644 --- a/re2o/acl.py +++ b/re2o/acl.py @@ -158,10 +158,15 @@ ModelC) messages.error( request, msg or _("You don't have the right to access" " this menu.")) - return redirect(reverse( - 'users:profil', - kwargs={'userid': str(request.user.id)} - )) + if request.user.id is not None: + return redirect(reverse( + 'users:profil', + kwargs={'userid': str(request.user.id)} + )) + else: + return redirect(reverse( + 'index', + )) return view(request, *chain(instances, args), **kwargs) return wrapper return decorator