Skip to content

Commit

Permalink
Add success_url to transition
Browse files Browse the repository at this point in the history
  • Loading branch information
Arkadiusz Adamski committed Feb 12, 2018
1 parent 7781325 commit 26b02eb
Show file tree
Hide file tree
Showing 12 changed files with 223 additions and 119 deletions.
36 changes: 36 additions & 0 deletions src/ralph/accounts/helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from urllib.parse import urlencode

from django.conf import settings
from django.core.urlresolvers import reverse

from ralph.admin.sites import ralph_site
from ralph.back_office.models import BackOfficeAsset
from ralph.lib.transitions.models import Transition

ACCEPTANCE_TRANSITION_ID = settings.ACCEPT_ASSETS_FOR_CURRENT_USER_CONFIG['TRANSITION_ID'] # noqa: E509
ACCEPTANCE_BACK_OFFICE_ACCEPT_STATUS = settings.ACCEPT_ASSETS_FOR_CURRENT_USER_CONFIG['BACK_OFFICE_ACCEPT_STATUS'] # noqa: E509


def acceptance_transition_exists():
return Transition.objects.filter(
id=ACCEPTANCE_TRANSITION_ID
).exists()


def get_assets_to_accept(user):
return BackOfficeAsset.objects.filter(
status=ACCEPTANCE_BACK_OFFICE_ACCEPT_STATUS
).filter(user=user)


def get_acceptance_url(user):
assets_to_accept = get_assets_to_accept(user)
admin_instance = ralph_site.get_admin_instance_for_model(
BackOfficeAsset
)
url_name = admin_instance.get_transition_bulk_url_name()
if assets_to_accept:
url = reverse(url_name, args=(ACCEPTANCE_TRANSITION_ID,))
query = urlencode([('select', a.id) for a in assets_to_accept])
return '?'.join((url, query))
return None
48 changes: 12 additions & 36 deletions src/ralph/accounts/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
from datetime import date
from urllib.parse import urlencode

import reversion
from django.conf import settings
Expand All @@ -12,10 +11,14 @@
from django.views.generic import View

from ralph.accounts.admin import AssetList, AssignedLicenceList, UserInfoMixin
from ralph.accounts.helpers import (
acceptance_transition_exists,
ACCEPTANCE_TRANSITION_ID,
get_acceptance_url,
get_assets_to_accept
)
from ralph.admin.mixins import RalphBaseTemplateView, RalphTemplateView
from ralph.admin.sites import ralph_site
from ralph.back_office.models import BackOfficeAsset
from ralph.lib.transitions.models import Transition
from ralph.licences.models import BaseObjectLicence


Expand Down Expand Up @@ -128,46 +131,19 @@ def post(self, request, *args, **kwargs):


class _AcceptanceProcessByCurrentUserMixin(object):
_config = settings.ACCEPT_ASSETS_FOR_CURRENT_USER_CONFIG

@property
def acceptance_transition_id(self):
return self._config['TRANSITION_ID']

@property
def back_office_status(self):
return self._config['BACK_OFFICE_ACCEPT_STATUS']

@property
def acceptance_transition_exists(self):
return Transition.objects.filter(
id=self.acceptance_transition_id
).exists()

def post(self, request, *args, **kwargs):
assets_to_accept = self.get_assets_to_accept()
admin_instance = ralph_site.get_admin_instance_for_model(
BackOfficeAsset
)
url_name = admin_instance.get_transition_bulk_url_name()
if assets_to_accept:
url = reverse(url_name, args=(self.acceptance_transition_id,))
query = urlencode([('select', a.id) for a in assets_to_accept])
return HttpResponseRedirect('?'.join((url, query)))
acceptance_url = get_acceptance_url(request.user)
if acceptance_url:
return HttpResponseRedirect(acceptance_url)
return super().get(request, *args, **kwargs)

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['acceptance_transition_id'] = self.acceptance_transition_id
context['acceptance_transition_exists'] = self.acceptance_transition_exists # noqa: E501
context['assets_to_accept'] = self.get_assets_to_accept()
context['acceptance_transition_id'] = ACCEPTANCE_TRANSITION_ID
context['acceptance_transition_exists'] = acceptance_transition_exists() # noqa: E501
context['assets_to_accept'] = get_assets_to_accept(self.request.user)
return context

def get_assets_to_accept(self):
return BackOfficeAsset.objects.filter(
status=self.back_office_status
).filter(user=self.request.user)


class _DummyMixin(object):
pass
Expand Down
12 changes: 3 additions & 9 deletions src/ralph/admin/templates/admin/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,12 @@
<div class="row">
<div class="small-8 large-8 columns">
<div class="summary module row">
{% cache 60 summary %}
{% ralph_summary %}
{% endcache %}
{% ralph_summary %}
</div>
{% my_services request.user %}
<div class="capacities module row">
{% cache 60 dc_capacity %}
{% dc_capacity data_centers %}
{% endcache %}
</div>
{% dc_capacity data_centers %}
</div>
<div class="small-4 large-4 separator columns">
<div class="small-4 large-4 columns">
<div class="module recent-actions">
<h2>{% trans 'My Recent Actions' %}</h2>
{% get_admin_log 20 as admin_log for_user user %}
Expand Down
34 changes: 19 additions & 15 deletions src/ralph/admin/templates/admin/templatetags/dc_capacity.html
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
{% for capacity in capacities %}
<div class="capacity-info {{ capacity.size }}">
<div class="title">
<a href="{{ capacity.url }}" target="_blank">{{ capacity.dc }}</a>
</div>
<div class="c100 p{{ capacity.capacity }} {{ capacity.color }}">
<span data-tooltip aria-haspopup="true" class="has-tip" title="{{ capacity.tooltip }}">{{ capacity.capacity }}%
</span>
<div class="slice">
<div class="bar"></div>
<div class="fill"></div>
</div>
</div>
</div>
{% endfor %}
{% if capacities %}
<div class="capacities module row">
{% for capacity in capacities %}
<div class="capacity-info {{ capacity.size }}">
<div class="title">
<a href="{{ capacity.url }}" target="_blank">{{ capacity.dc }}</a>
</div>
<div class="c100 p{{ capacity.capacity }} {{ capacity.color }}">
<span data-tooltip aria-haspopup="true" class="has-tip" title="{{ capacity.tooltip }}">{{ capacity.capacity }}%
</span>
<div class="slice">
<div class="bar"></div>
<div class="fill"></div>
</div>
</div>
</div>
{% endfor %}
</div>
{% endif %}
29 changes: 13 additions & 16 deletions src/ralph/admin/templates/admin/templatetags/ralph_summary.html
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
{% load i18n %}

{% for result in results %}
{% if forloop.counter0|divisibleby:3 %}
<div class="categories">
{% endif %}
<div class="category {{ result.class }}">
<div class="wrapper">
<div class="name">{{ result.label }}</div>
<div class="value">{{ result.count }}</div>
<i class="fa icon" aria-hidden="true"></i>
<a href="{% url result.url_name %}" class="link">{% trans 'Show' %}</a>
</div>
</div>
{% if forloop.counter|divisibleby:3 %}
</div>
{% endif %}
{% endfor %}
<div class="categories">
{% for result in results %}
<div class="category {{ result.class }}">
<a href="{{ result.url }}">
<div class="wrapper">
<div class="name">{{ result.label | title }}</div>
<div class="value">{{ result.count }}</div>
<i class="fa icon" aria-hidden="true"></i>
</div>
</a>
</div>
{% endfor %}
</div>
58 changes: 48 additions & 10 deletions src/ralph/admin/templatetags/dashboard_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
from django.apps import apps
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db.models import Count, Prefetch, Sum
from django.db.models import Count, Prefetch, Q, Sum
from django.template import Library
from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _

from ralph.assets.models import BaseObject, Service, ServiceEnvironment
from ralph.back_office.models import BackOfficeAsset
from ralph.data_center.models import (
DataCenter,
DataCenterAsset,
Expand All @@ -18,10 +20,33 @@
)

register = Library()

COLORS = ['green', 'blue', 'purple', 'orange', 'red', 'pink']


def get_user_equipment_tile_data(user):
return {
'class': 'my-equipment',
'label': _('Your equipment'),
'count': BackOfficeAsset.objects.filter(
Q(user=user) | Q(owner=user)
).count(),
'url': reverse('current_user_info'),
}


def get_user_equipment_to_accept_tile_data(user):
from ralph.accounts.helpers import get_assets_to_accept, get_acceptance_url
assets_to_accept_count = get_assets_to_accept(user).count()
if not assets_to_accept_count:
return None
return {
'class': 'equipment-to-accept',
'label': _('Equipments to accept'),
'count': assets_to_accept_count,
'url': get_acceptance_url(user),
}


def get_available_space_in_data_centers(data_centers):
available = Rack.objects.filter(
server_room__data_center__in=data_centers,
Expand Down Expand Up @@ -54,8 +79,13 @@ def get_used_space_in_data_centers(data_centers):
return Counter(dict(used_by_assets)) + Counter(dict(used_by_accessories))


@register.inclusion_tag('admin/templatetags/dc_capacity.html')
def dc_capacity(data_centers=None, size='big'):
@register.inclusion_tag(
'admin/templatetags/dc_capacity.html', takes_context=True
)
def dc_capacity(context, data_centers=None, size='big'):
user = context.request.user
if not user.has_perm('data_center.view_datacenter'):
return {}
color = cycle(COLORS)
if not data_centers:
data_centers = DataCenter.objects.all()
Expand Down Expand Up @@ -85,8 +115,11 @@ def dc_capacity(data_centers=None, size='big'):
return {'capacities': results}


@register.inclusion_tag('admin/templatetags/ralph_summary.html')
def ralph_summary():
@register.inclusion_tag(
'admin/templatetags/ralph_summary.html', takes_context=True
)
def ralph_summary(context):
user = context.request.user
models = [
'data_center.DataCenterAsset',
'back_office.BackOfficeAsset',
Expand All @@ -100,16 +133,21 @@ def ralph_summary():
app, model = model_name.split('.')
model = apps.get_model(app, model)
meta = model._meta
if not user.has_perm('{}.view_{}'.format(app, meta.model_name)):
continue
results.append({
'label': meta.verbose_name_plural,
'count': model.objects.count(),
'class': slugify(meta.verbose_name_plural),
'class': slugify(meta.model_name),
'icon': 'icon',
'url_name': 'admin:{}_{}_changelist'.format(
'url': reverse('admin:{}_{}_changelist'.format(
meta.app_label, meta.model_name
)

))
})
results.append(get_user_equipment_tile_data(user=user))
accept_tile_data = get_user_equipment_to_accept_tile_data(user=user)
if accept_tile_data:
results.append(accept_tile_data)
return {'results': results}


Expand Down
2 changes: 1 addition & 1 deletion src/ralph/lib/transitions/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,5 +130,5 @@ class Meta:
model = Transition
fields = [
'name', 'source', 'target', 'run_asynchronously',
'async_service_name', 'template_name', 'actions',
'async_service_name', 'template_name', 'success_url', 'actions',
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import ralph.lib.mixins.fields


class Migration(migrations.Migration):

dependencies = [
('transitions', '0008_auto_20171211_1300'),
]

operations = [
migrations.AddField(
model_name='transition',
name='success_url',
field=ralph.lib.mixins.fields.NullableCharField(default=None, null=True, max_length=255),
),
]
4 changes: 4 additions & 0 deletions src/ralph/lib/transitions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
JobQuerySet
)
from ralph.lib.metrics import statsd
from ralph.lib.mixins.fields import NullableCharField
from ralph.lib.mixins.models import AdminAbsoluteUrlMixin, TimeStampMixin
from ralph.lib.transitions.conf import (
DEFAULT_ASYNC_TRANSITION_SERVICE_NAME,
Expand Down Expand Up @@ -526,6 +527,9 @@ class Transition(models.Model):
target = models.CharField(max_length=50)
actions = models.ManyToManyField('Action')
template_name = models.CharField(max_length=255, blank=True, default='')
success_url = NullableCharField(
max_length=255, blank=True, null=True, default=None
)

class Meta:
unique_together = ('name', 'model')
Expand Down
16 changes: 16 additions & 0 deletions src/ralph/lib/transitions/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,19 @@ def test_custom_template_for_transition(self):
Order, 'custom template test',
template_name='test.html'
)

def test_success_url_should_redirect(self):
success_url = 'http://test.com/foo/bar/'
_, transition, _ = self._create_transition(
Order, 'packing', ['pack'], source=[OrderStatus.new.id],
target=OrderStatus.to_send.id,
success_url=success_url,
)
order = Order.objects.create()
transition_url = reverse(
'admin:tests_order_transition',
args=(order.pk, transition.pk,)
)
self.login_as_user()
response = self.client.post(transition_url)
self.assertEqual(response.url, success_url)
Loading

0 comments on commit 26b02eb

Please sign in to comment.