Skip to content

Commit

Permalink
Merge branch 'master' into stable
Browse files Browse the repository at this point in the history
  • Loading branch information
migonzalvar committed Aug 19, 2020
2 parents dae69fc + c327f5e commit ea8ded3
Show file tree
Hide file tree
Showing 233 changed files with 9,833 additions and 17,348 deletions.
21 changes: 18 additions & 3 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,21 @@

## Unreleased

## 5.5.0 (2020-08-19)

### Features

- Verify user email.

- Task promotion creates user story and deletes original task.

### Misc

- Upgraded Django version to 2.2. This is a BREAKING CHANGE. Contributed
modules should be upgraded.

- Several minor bugfixes.

## 5.0.15 (2020-06-17)

### Misc
Expand All @@ -20,7 +35,7 @@

- Resolved Django deprecation warnings to prepare for an upgrade.

- Added option to disallow anonymous access to user profiles.
- Added option to disallow anonymous access to user profiles.

### Misc

Expand Down Expand Up @@ -269,12 +284,12 @@

- Minor icon changes
- Lots of small bugfixes

## 3.4.5 (2018-10-15)

### Features

- Prevent local Webhooks
- Prevent local Webhooks

## 3.4.4 (2018-09-19)

Expand Down
27 changes: 0 additions & 27 deletions pytest.ini
Expand Up @@ -2,30 +2,3 @@
DJANGO_SETTINGS_MODULE = settings.testing
filterwarnings =
default::DeprecationWarning
error::django.utils.deprecation.RemovedInDjango20Warning
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.external_apps.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.feedback.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.hooks.bitbucket.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.hooks.github.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.hooks.gitlab.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.hooks.gogs.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.attachments.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.contact.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.custom_attributes.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.epics.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.history.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.issues.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.likes.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.milestones.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.notifications.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.references.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.settings.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.tasks.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.userstories.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.votes.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.projects.wiki.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.timeline.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.users.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.userstorage.migrations[.*]
ignore::django.utils.deprecation.RemovedInDjango20Warning:taiga.webhooks.migrations[.*]
19 changes: 10 additions & 9 deletions requirements-devel.txt
Expand Up @@ -5,26 +5,27 @@
# pip-compile requirements-devel.in
#
attrs==19.3.0 # via -c requirements.txt, pytest
certifi==2020.4.5.1 # via -c requirements.txt, requests
certifi==2020.6.20 # via -c requirements.txt, requests
chardet==3.0.4 # via -c requirements.txt, requests
coverage==5.1 # via -r requirements-devel.in, coveralls
coveralls==2.0.0 # via -r requirements-devel.in
coverage==5.2.1 # via -r requirements-devel.in, coveralls
coveralls==2.1.1 # via -r requirements-devel.in
docopt==0.6.2 # via -c requirements.txt, coveralls
factory-boy==2.12.0 # via -r requirements-devel.in
faker==4.1.0 # via factory-boy
faker==4.1.1 # via factory-boy
idna==2.8 # via -c requirements.txt, requests
importlib-metadata==1.6.0 # via -c requirements.txt, pluggy, pytest
more-itertools==8.3.0 # via pytest
importlib-metadata==1.7.0 # via -c requirements.txt, pluggy, pytest
iniconfig==1.0.1 # via pytest
more-itertools==8.4.0 # via pytest
packaging==20.4 # via -c requirements.txt, pytest
pluggy==0.13.1 # via pytest
py==1.8.1 # via pytest
py==1.9.0 # via pytest
pyparsing==2.4.7 # via -c requirements.txt, packaging
pytest-django==3.9.0 # via -r requirements-devel.in
pytest==5.4.2 # via -r requirements-devel.in, pytest-django
pytest==6.0.1 # via -r requirements-devel.in, pytest-django
python-dateutil==2.7.5 # via -c requirements.txt, faker
requests==2.21.0 # via -c requirements.txt, coveralls
six==1.15.0 # via -c requirements.txt, packaging, python-dateutil
text-unidecode==1.3 # via faker
toml==0.10.1 # via pytest
urllib3==1.24.3 # via -c requirements.txt, requests
wcwidth==0.1.9 # via pytest
zipp==1.2.0 # via -c requirements.txt, importlib-metadata
6 changes: 3 additions & 3 deletions requirements.in
Expand Up @@ -8,7 +8,7 @@ django-jinja==2.3.1
django-picklefield==0.3.2
django-pglocks==1.0.2
django-sampledatahelper==0.4.1
django-sites==0.9
django-sites==0.10
django-sr==0.0.4
djmail==1.0.1
easy-thumbnails==2.7.0
Expand All @@ -17,7 +17,7 @@ gunicorn==19.9.0
netaddr==0.7.19
premailer==3.0.1
psd-tools==1.8.27
psycopg2-binary==2.7.5
psycopg2-binary==2.8.5
python-dateutil==2.7.5
python-magic==0.4.15
pytz
Expand All @@ -28,7 +28,7 @@ requests_oauthlib
serpy==0.1.1
webcolors==1.9.1
CairoSVG==2.0.3
Django>=1.11.23,<2
Django>=2.2,<3
Markdown==3.1.1
Pillow
Unidecode==0.4.20
Expand Down
25 changes: 13 additions & 12 deletions requirements.txt
Expand Up @@ -5,17 +5,17 @@
# pip-compile requirements.in
#
aggdraw==1.3.11 # via psd-tools
amqp==2.5.2 # via kombu
amqp==2.6.1 # via kombu
asana==0.6.7 # via -r requirements.in
asn1crypto==1.3.0 # via cryptography
asn1crypto==1.4.0 # via cryptography
attrs==19.3.0 # via psd-tools
billiard==3.6.3.0 # via celery
bleach==3.1.5 # via -r requirements.in
cairocffi==1.1.0 # via cairosvg
cairosvg==2.0.3 # via -r requirements.in
celery==4.3.0 # via -r requirements.in
certifi==2020.4.5.1 # via requests
cffi==1.14.0 # via cairocffi, cryptography
certifi==2020.6.20 # via requests
cffi==1.14.1 # via cairocffi, cryptography
chardet==3.0.4 # via requests
cryptography==2.3.1 # via -r requirements.in, oauthlib
cssselect==1.1.0 # via cairosvg, premailer
Expand All @@ -26,30 +26,30 @@ django-jinja==2.3.1 # via -r requirements.in
django-pglocks==1.0.2 # via -r requirements.in
django-picklefield==0.3.2 # via -r requirements.in
django-sampledatahelper==0.4.1 # via -r requirements.in
django-sites==0.9 # via -r requirements.in
django-sites==0.10 # via -r requirements.in
django-sr==0.0.4 # via -r requirements.in
django==1.11.29 # via -r requirements.in, django-jinja, django-sampledatahelper, django-sites, django-sr, easy-thumbnails
django==2.2.15 # via -r requirements.in, django-jinja, django-sampledatahelper, django-sites, django-sr, easy-thumbnails
djmail==1.0.1 # via -r requirements.in
docopt==0.6.2 # via psd-tools
easy-thumbnails==2.7.0 # via -r requirements.in
fn==0.4.3 # via -r requirements.in
gunicorn==19.9.0 # via -r requirements.in
html5lib==1.0.1 # via -r requirements.in
html5lib==1.1 # via -r requirements.in
idna==2.8 # via cryptography, requests
importlib-metadata==1.6.0 # via kombu
importlib-metadata==1.7.0 # via kombu
jinja2==2.11.2 # via django-jinja
kombu==4.6.8 # via celery
lxml==4.5.1 # via cairosvg, premailer
kombu==4.6.11 # via celery
lxml==4.5.2 # via cairosvg, premailer
markdown==3.1.1 # via -r requirements.in
markupsafe==1.1.1 # via jinja2
netaddr==0.7.19 # via -r requirements.in
oauthlib[signedtoken]==3.1.0 # via -r requirements.in, requests-oauthlib
packaging==20.4 # via bleach
packbits==0.6 # via psd-tools
pillow==7.1.2 # via -r requirements.in, cairosvg, easy-thumbnails, psd-tools
pillow==7.2.0 # via -r requirements.in, cairosvg, easy-thumbnails, psd-tools
premailer==3.0.1 # via -r requirements.in
psd-tools==1.8.27 # via -r requirements.in
psycopg2-binary==2.7.5 # via -r requirements.in
psycopg2-binary==2.8.5 # via -r requirements.in
pycparser==2.20 # via cffi
pygments==2.2.0 # via -r requirements.in
pyjwt==1.7.1 # via oauthlib
Expand All @@ -64,6 +64,7 @@ requests==2.21.0 # via -r requirements.in, asana, premailer, requests-o
sampledata==0.3.7 # via django-sampledatahelper
serpy==0.1.1 # via -r requirements.in
six==1.15.0 # via asana, bleach, cryptography, django-sampledatahelper, html5lib, packaging, python-dateutil, sampledata, serpy, webcolors
sqlparse==0.3.1 # via django
tinycss==0.4 # via cairosvg
unidecode==0.4.20 # via -r requirements.in
urllib3==1.24.3 # via requests
Expand Down
1 change: 1 addition & 0 deletions scripts/manage_translations.py
Expand Up @@ -98,6 +98,7 @@ def update_catalogs(resources=None, languages=None):
"no_obsolete": False,
"keep_pot": False,
"verbosity": 0,
"add_location": None,
}

if resources is not None:
Expand Down
4 changes: 4 additions & 0 deletions taiga/auth/services.py
Expand Up @@ -24,6 +24,7 @@
should be contained in a class". Because of that, it
not uses clasess and uses simple functions.
"""
import uuid

from django.apps import apps
from django.contrib.auth import get_user_model
Expand Down Expand Up @@ -115,6 +116,9 @@ def public_register(username:str, password:str, email:str, full_name:str):
user_model = get_user_model()
user = user_model(username=username,
email=email,
email_token=str(uuid.uuid4()),
new_email=email,
verified_email=False,
full_name=full_name,
read_new_terms=True)
user.set_password(password)
Expand Down
2 changes: 1 addition & 1 deletion taiga/base/api/fields.py
Expand Up @@ -457,7 +457,7 @@ def from_native(self, value):
return self.model_field.to_python(value)

def field_to_native(self, obj, field_name):
value = self.model_field._get_val_from_obj(obj)
value = self.model_field.value_from_object(obj)
if is_protected_type(value):
return value
return self.model_field.value_to_string(obj)
Expand Down
2 changes: 1 addition & 1 deletion taiga/base/api/relations.py
Expand Up @@ -49,7 +49,7 @@
model relationships, including hyperlinks, primary keys, or slugs.
"""
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
from django.urls import resolve, get_script_prefix, NoReverseMatch
from django import forms
from django.db.models.fields import BLANK_CHOICE_DASH
from django.forms import widgets
Expand Down
4 changes: 2 additions & 2 deletions taiga/base/api/reverse.py
Expand Up @@ -45,13 +45,13 @@
"""
Provide reverse functions that return fully qualified URLs
"""
from django.core.urlresolvers import reverse as django_reverse
from django.urls import reverse as django_reverse
from django.utils.functional import lazy


def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra):
"""
Same as `django.core.urlresolvers.reverse`, but optionally takes a request
Same as `django.core.urlresolvers`, but optionally takes a request
and returns a fully qualified URL, using the request to get the base URL.
"""
if format is not None:
Expand Down
8 changes: 4 additions & 4 deletions taiga/base/api/urlpatterns.py
Expand Up @@ -43,7 +43,7 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


from django.core.urlresolvers import RegexURLResolver
from django.urls import URLResolver
from django.conf.urls import url, include

from .settings import api_settings
Expand All @@ -52,9 +52,9 @@
def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required):
ret = []
for urlpattern in urlpatterns:
if isinstance(urlpattern, RegexURLResolver):
if isinstance(urlpattern, URLResolver):
# Set of included URL patterns
regex = urlpattern.regex.pattern
regex = urlpattern.pattern.regex.pattern
namespace = urlpattern.namespace
app_name = urlpattern.app_name
kwargs = urlpattern.default_kwargs
Expand All @@ -66,7 +66,7 @@ def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required):

else:
# Regular URL pattern
regex = urlpattern.regex.pattern.rstrip("$") + suffix_pattern
regex = urlpattern.pattern.regex.pattern.rstrip("$") + suffix_pattern
view = urlpattern.callback
kwargs = urlpattern.default_args
name = urlpattern.name
Expand Down
6 changes: 3 additions & 3 deletions taiga/base/api/utils/encoders.py
Expand Up @@ -48,7 +48,7 @@
from django.db.models.query import QuerySet
from django.utils.functional import Promise
from django.utils import timezone
from django.utils.deprecation import CallableBool
# from django.utils.deprecation import CallableBool
from django.utils.encoding import force_text

import datetime
Expand All @@ -67,8 +67,8 @@ def default(self, o):
# http://ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
if isinstance(o, Promise):
return force_text(o)
elif isinstance(o, CallableBool):
return bool(o)
# elif isinstance(o, CallableBool):
# return bool(o)
elif isinstance(o, datetime.datetime):
r = o.isoformat()
if o.microsecond:
Expand Down
2 changes: 1 addition & 1 deletion taiga/base/routers.py
Expand Up @@ -22,7 +22,7 @@
from collections import namedtuple
from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch
from django.urls import NoReverseMatch, URLResolver

from taiga.base.api import views
from taiga.base import response
Expand Down
2 changes: 1 addition & 1 deletion taiga/base/utils/urls.py
Expand Up @@ -22,7 +22,7 @@
from urllib.parse import urlparse

import django_sites as sites
from django.core.urlresolvers import reverse as django_reverse
from django.urls import reverse as django_reverse
from django.utils.translation import ugettext as _

URL_TEMPLATE = "{scheme}://{domain}/{path}"
Expand Down
1 change: 1 addition & 0 deletions taiga/export_import/serializers/serializers.py
Expand Up @@ -269,6 +269,7 @@ class UserStoryExportSerializer(CustomAttributesValuesExportSerializerMixin,
finish_date = DateTimeField()
generated_from_issue = SlugRelatedField(slug_field="ref")
generated_from_task = SlugRelatedField(slug_field="ref")
from_task_ref = Field()
ref = Field()
is_closed = Field()
backlog_order = Field()
Expand Down
6 changes: 5 additions & 1 deletion taiga/export_import/services/store.py
Expand Up @@ -759,7 +759,8 @@ def _create_project_object(data):


def _create_membership_for_project_owner(project):
if project.memberships.filter(user=project.owner).count() == 0:
owner_membership = project.memberships.filter(user=project.owner).first()
if owner_membership is None:
if project.roles.all().count() > 0:
Membership.objects.create(
project=project,
Expand All @@ -768,6 +769,9 @@ def _create_membership_for_project_owner(project):
role=project.roles.all().first(),
is_admin=True
)
elif not owner_membership.is_admin:
owner_membership.is_admin = True
owner_membership.save()


def _populate_project_object(project, data):
Expand Down
2 changes: 1 addition & 1 deletion taiga/export_import/validators/validators.py
Expand Up @@ -342,7 +342,7 @@ class UserStoryExportValidator(WatcheableObjectModelValidatorMixin):

class Meta:
model = userstories_models.UserStory
exclude = ('id', 'project', 'points', 'tasks')
exclude = ('id', 'project', 'points', 'tasks', 'from_task_ref')

def custom_attributes_queryset(self, project):
if project.id not in _custom_userstories_attributes_cache:
Expand Down
4 changes: 2 additions & 2 deletions taiga/external_apps/migrations/0001_initial.py
Expand Up @@ -38,8 +38,8 @@ class Migration(migrations.Migration):
('auth_code', models.CharField(null=True, blank=True, max_length=255, default=None)),
('token', models.CharField(null=True, blank=True, max_length=255, default=None)),
('state', models.CharField(null=True, blank=True, max_length=255, default='')),
('application', models.ForeignKey(verbose_name='application', related_name='application_tokens', to='external_apps.Application')),
('user', models.ForeignKey(verbose_name='user', related_name='application_tokens', to=settings.AUTH_USER_MODEL)),
('application', models.ForeignKey(verbose_name='application', related_name='application_tokens', to='external_apps.Application', on_delete=models.CASCADE)),
('user', models.ForeignKey(verbose_name='user', related_name='application_tokens', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
],
options={
},
Expand Down

0 comments on commit ea8ded3

Please sign in to comment.