Skip to content

Commit

Permalink
Merge pull request #573 from rdmorganiser/dev
Browse files Browse the repository at this point in the history
RDMO 1.9.1
  • Loading branch information
triole committed Feb 3, 2023
2 parents ef6e1f8 + 184deb9 commit 4e8739b
Show file tree
Hide file tree
Showing 29 changed files with 274 additions and 52 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
# Changelog

## RDMO 1.9.1 (Feb 03, 2023)

* Fix overlays if tasks/views are not available for a project
* Add a last overlay with the invitation to contact local support
* Add find_inactive_users and find_inactive_projects management scripts
* Add delete_projects management script
* Fix cancel button on project import
* Add A4 as default paper size to pandoc args
* Improve continuous integration

## RDMO 1.9.0 (Nov 28, 2022)

* Automatically update existing projects on saving of views
Expand Down
32 changes: 32 additions & 0 deletions rdmo/core/management/commands/find_inactive_users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import sys
import csv

from datetime import datetime

import pytz

from django.contrib.auth.models import User
from django.core.management.base import BaseCommand


class Command(BaseCommand):

columns = ('id', 'username', 'first_name', 'last_name', 'email', 'date_joined', 'last_login')

def add_arguments(self, parser):
parser.add_argument('since',
type=lambda s: pytz.utc.localize(datetime.strptime(s, '%Y-%m-%d')),
help='Date since the users have been inactive (format: "2022-12-31").')
parser.add_argument('-o|--output-file', dest='output_file', default=None,
help='Store the output in a csv file.')

def handle(self, *args, **options):
rows = User.objects.filter(last_login__lt=options['since']) \
.order_by('-last_login').values_list(*self.columns)

if rows:
fp = open(options['output_file'], 'w') if options['output_file'] else sys.stdout
csv_writer = csv.writer(fp)
csv_writer.writerow(self.columns)
csv_writer.writerows(rows)
fp.close()
11 changes: 7 additions & 4 deletions rdmo/core/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@
'projects': [
'projects-table',
'create-project',
'import-project'
'import-project',
'support-info'
],
'project': [
'project-questions',
Expand All @@ -222,11 +223,13 @@
'project-memberships',
'project-snapshots',
'export-project',
'import-project'
'import-project',
'support-info'
],
'issue_send': [
'issue-message',
'issue-attachments'
'issue-attachments',
'support-info'
]
}

Expand All @@ -247,7 +250,7 @@
EXPORT_REFERENCE_DOCX = None

EXPORT_PANDOC_ARGS = {
'pdf': ['-V', 'geometry:margin=1in', '--pdf-engine=xelatex'],
'pdf': ['-V', 'geometry:a4paper, margin=1in', '--pdf-engine=xelatex'],
'rtf': ['--standalone']
}

Expand Down
Binary file modified rdmo/locale/de/LC_MESSAGES/django.mo
Binary file not shown.
4 changes: 2 additions & 2 deletions rdmo/locale/de/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -660,8 +660,8 @@ msgid ""
"mail using the <a href=\"%(email_url)s\">e-mail form</a>."
msgstr ""
"Bitte aktualisieren Sie die in Ihrem Benutzerkonto gespeicherten "
"Informationen. Sie können Ihr Password <a href=\"%(password_url)s\">hier</a> "
"ändern und ihre E-Mail Adressen <a href=\"%(email_url)s\">hier</a> verwalten."
"Informationen. Sie können Ihr Passwort <a href=\"%(password_url)s\">hier</a> "
"ändern und ihre E-Mail Adresse <a href=\"%(email_url)s\">hier</a> verwalten."

#: accounts/templates/profile/profile_update_form.html:33
msgid ""
Expand Down
6 changes: 6 additions & 0 deletions rdmo/overlays/static/overlays/js/overlays.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ function initOverlays(url_name) {
'content': $(overlayId).html(),
})

// if overlay element does not exist, proceed with next overlay
if (!$(elementId).length) {
fetchResponse('next');
return;
}

// show popover
$(elementId).popover(opts).popover('show');

Expand Down
19 changes: 0 additions & 19 deletions rdmo/overlays/utils.py

This file was deleted.

9 changes: 5 additions & 4 deletions rdmo/overlays/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from django.conf import settings
from django.contrib.sites.models import Site
from rest_framework.decorators import action
from rest_framework.exceptions import NotFound
Expand All @@ -6,15 +7,15 @@
from rest_framework.viewsets import ViewSet

from .models import Overlay
from .utils import get_overlays


class OverlayViewSet(ViewSet):

@action(detail=False, methods=['post'], url_path='(?P<url_name>[-\\w]+)/current', permission_classes=[IsAuthenticated])
def current(self, request, url_name=None):
site = Site.objects.get_current()
overlays = get_overlays(url_name)
overlays = settings.OVERLAYS.get(url_name)[:]

if not overlays:
raise NotFound()

Expand All @@ -31,7 +32,7 @@ def current(self, request, url_name=None):
@action(detail=False, methods=['post'], url_path='(?P<url_name>[-\\w]+)/next', permission_classes=[IsAuthenticated])
def next(self, request, url_name=None):
site = Site.objects.get_current()
overlays = get_overlays(url_name)
overlays = settings.OVERLAYS.get(url_name)[:]
if not overlays:
raise NotFound()

Expand All @@ -53,7 +54,7 @@ def next(self, request, url_name=None):
@action(detail=False, methods=['post'], url_path='(?P<url_name>[-\\w]+)/dismiss', permission_classes=[IsAuthenticated])
def dismiss(self, request, url_name=None):
site = Site.objects.get_current()
overlays = get_overlays(url_name)
overlays = settings.OVERLAYS.get(url_name)[:]
if not overlays:
raise NotFound()

Expand Down
7 changes: 4 additions & 3 deletions rdmo/projects/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,17 @@ def __init__(self, *args, **kwargs):

def clean_username_or_email(self):
username_or_email = self.cleaned_data['username_or_email']
usermodel = get_user_model()

# check if it is a registered
# check if it is a registered user
try:
self.cleaned_data['user'] = get_user_model().objects.get(Q(username=username_or_email) | Q(email__iexact=username_or_email))
self.cleaned_data['user'] = usermodel.objects.get(Q(username=username_or_email) | Q(email__iexact=username_or_email))
self.cleaned_data['email'] = self.cleaned_data['user'].email

if self.cleaned_data['user'] in self.project.user.all():
raise ValidationError(_('The user is already a member of the project.'))

except get_user_model().DoesNotExist:
except (usermodel.DoesNotExist, usermodel.MultipleObjectsReturned):
if settings.PROJECT_SEND_INVITE:
# check if it is a valid email address, this will raise the correct ValidationError
EmailValidator()(username_or_email)
Expand Down
32 changes: 32 additions & 0 deletions rdmo/projects/management/commands/delete_projects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import re

from django.core.management.base import BaseCommand

from rdmo.projects.models import Project


class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
'id_list_file', type=str,
help='required list of project ids to delete in plain text format, ' +
'project ids have to be at the beginning of the line, ' +
'supports commenting lines out: if a line does ' +
'not start with an integer it will be skipped'
)

def handle(self, *args, **options):
project_ids = set()
with open(options['id_list_file']) as fp:
for line in fp.readlines():
m = re.search(r'^([0-9]+)', line)
if m:
project_ids.add(int(m.group(1)))

if input(f'You are about to delete {len(project_ids)} projects. '
'Are you sure? If so please enter \'yes\' to continue: ') == 'yes':
for project in Project.objects.filter(id__in=project_ids):
project.delete()
print(f'Project {project} deleted.')
else:
print('Aborted!')
44 changes: 44 additions & 0 deletions rdmo/projects/management/commands/find_inactive_projects.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import sys
import csv

from datetime import datetime

import pytz

from django.db import models
from django.db.models.functions import Greatest
from django.core.management.base import BaseCommand


from rdmo.projects.models import Project, Value


class Command(BaseCommand):

columns = ('id', 'title', 'created', 'updated', 'last_changed')

def add_arguments(self, parser):
parser.add_argument('since',
type=lambda s: pytz.utc.localize(datetime.strptime(s, '%Y-%m-%d')),
help='Date since the projects have been inactive (format: 2022-12-31).')
parser.add_argument('-o|--output-file', dest='output_file', default=None,
help='Store the output in a csv file.')

def handle(self, *args, **options):
# prepare subquery for last_changed
last_changed_subquery = models.Subquery(
Value.objects.filter(project=models.OuterRef('pk')).order_by('-updated').values('updated')[:1]
)

# prepare actual query
rows = Project.objects.annotate(last_changed=Greatest('updated', last_changed_subquery)) \
.filter(last_changed__lt=options['since']) \
.order_by('-last_changed') \
.values_list(*self.columns)

if rows:
fp = open(options['output_file'], 'w') if options['output_file'] else sys.stdout
csv_writer = csv.writer(fp)
csv_writer.writerow(self.columns)
csv_writer.writerows(rows)
fp.close()
6 changes: 6 additions & 0 deletions rdmo/projects/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,12 @@ def import_file(self):
def import_project(self):
current_project = self.object

if 'cancel' in self.request.POST:
if current_project:
return HttpResponseRedirect(current_project.get_absolute_url())
else:
return HttpResponseRedirect(self.success_url)

# get the original project
project = get_object_or_404(Project.objects.all(), id=self.request.POST.get('source'))

Expand Down
4 changes: 4 additions & 0 deletions rdmo/projects/templates/projects/issue_send.html
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ <h1>{% trans 'Send task' %}</h1>
{% if integrations %}
{% include 'projects/issue_send_integrations.html'%}
{% endif %}

<div id="support-info"></div>
</div>
<div class="sidebar col-md-3">
{% include 'projects/issue_send_sidebar.html'%}
Expand All @@ -48,7 +50,9 @@ <h1>{% trans 'Send task' %}</h1>
</div>
</div>


{% render_lang_template 'projects/overlays/issue_send_issue_message' %}
{% render_lang_template 'projects/overlays/issue_send_issue_attachments' %}
{% render_lang_template 'projects/overlays/issue_send_support_info' %}

{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Unterstützung"
data-placement="bottom">

Falls Sie weitere Fragen haben, wenden Sie sich gern an Ihre lokale Kontaktperson zum Thema Forschungsdaten.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

If you have further questions, please do not hesitate to ask your local contact person for research data management.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

Si vous avez d'autres questions, n'hésitez pas à vous adresser à votre personne de contact locale pour la gestion des données de recherche.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Supporto"
data-placement="bottom">

Per ulteriori domande, non esitate a rivolgervi al vostro referente locale per la gestione dei dati di ricerca.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Unterstützung"
data-placement="bottom">

Falls Sie weitere Fragen haben, wenden Sie sich gern an Ihre lokale Kontaktperson zum Thema Forschungsdaten.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

If you have further questions, please do not hesitate to ask your local contact person for research data management.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

Si vous avez d'autres questions, n'hésitez pas à vous adresser à votre personne de contact locale pour la gestion des données de recherche.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Supporto"
data-placement="bottom">

Per ulteriori domande, non esitate a rivolgervi al vostro referente locale per la gestione dei dati di ricerca.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Unterstützung"
data-placement="bottom">

Falls Sie weitere Fragen haben, wenden Sie sich gern an Ihre lokale Kontaktperson zum Thema Forschungsdaten.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

If you have further questions, please do not hesitate to ask your local contact person for research data management.

{% include 'overlays/buttons.html'%}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="overlay" id="support-info-overlay"
data-title="Support"
data-placement="bottom">

Si vous avez d'autres questions, n'hésitez pas à vous adresser à votre personne de contact locale pour la gestion des données de recherche.

{% include 'overlays/buttons.html'%}
</div>

0 comments on commit 4e8739b

Please sign in to comment.