ASTAKOS_EMAILCHANGE_ACTIVATION_DAYS 10 Number of days that email change requests remain active
ASTAKOS_LOGGING_LEVEL INFO Message logging severity
ASTAKOS_QUOTA_HOLDER_URL '' The quota holder URI
+ e.g. ``http://localhost:8080/api/quotaholder/v``
+AQUARIUM_URL '' The billing (aquarium) URI
+ e.g. ``http://localhost:8888/user``
=================================== ============================================================================= ===========================================================================================
Administrator functions
l.append(dict(url=absolute(reverse('feedback')), name="Feedback"))
l.append(dict(url=absolute(reverse('group_list')), name="Groups"))
l.append(dict(url=absolute(reverse('resource_list')), name="Resources"))
+ l.append(dict(url=absolute(reverse('billing')), name="Billing"))
if with_signout:
l.append(dict(url=absolute(reverse('logout')), name="Sign out"))
--- /dev/null
+# Copyright 2011-2012 GRNET S.A. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or
+# without modification, are permitted provided that the following
+# conditions are met:
+#
+# 1. Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the following
+# disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials
+# provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and
+# documentation are those of the authors and should not be
+# interpreted as representing official policies, either expressed
+# or implied, of GRNET S.A.
+
+import requests
+
+from django.utils import simplejson as json
+
+from astakos.im.settings import AQUARIUM_URL
+
+class AquariumClient():
+ def get_billing(self, user, start, end):
+ if not AQUARIUM_URL:
+ return
+
+ url = AQUARIUM_URL.rstrip('/')
+ url = '%s/%s/bill/%d/%d' % (url, user, start, end)
+ r = requests.get(url)
+ try:
+ return r.status_code, json.loads(r.text)
+ except ValueError:
+ pass
+ return r.status_code, None
\ No newline at end of file
LOGGING_LEVEL = getattr(settings, 'ASTAKOS_LOGGING_LEVEL', INFO)
# Set the quota holder component URI
-QUOTA_HOLDER_URL = getattr(settings, 'ASTAKOS_QUOTA_HOLDER_URL', '')
\ No newline at end of file
+QUOTA_HOLDER_URL = getattr(settings, 'ASTAKOS_QUOTA_HOLDER_URL', '')
+
+# Set the billing URI
+AQUARIUM_URL = getattr(settings, 'ASTAKOS_AQUARIUM_URL', '')
from functools import wraps
from astakos.im.endpoints.quotaholder import send_quota
-from astakos.im.endpoints.aquarium.producer import (report_credits_event
- , report_user_event
+from astakos.im.endpoints.aquarium.producer import (report_credits_event,
+ report_user_event
)
+from astakos.im.endpoints.aquarium.client import AquariumClient
import logging
def log(func):
@wraps(func)
def wrapper(*args, **kwargs):
- logger.info('Starting the %s' % func)
+ logger.info('Starting the %s with args=%s kwargs=%s' % (
+ func, args, kwargs
+ )
+ )
return func(*args, **kwargs)
return wrapper
if group.is_disabled:
return
send_quota(group.approved_members)
+
+@task
+@log
+def request_billing(user, start, end):
+ return AquariumClient().get_billing(user, start, end)
--- /dev/null
+{% extends "im/account_base.html" %}
+
+{% load filters %}
+
+{% block page.body %}
+ {% if data %}
+ {{ data }}
+ {% endif %}
+{% endblock %}
url(r'^approval_terms/(?P<term_id>\d+)/?$', 'approval_terms'),
url(r'^password/?$', 'change_password', {}, name='password_change'),
url(r'^resources/?$', 'resource_list', {}, name='resource_list'),
+ url(r'^billing/?$', 'billing', {}, name='billing'),
url(r'^group/add/(?P<kind_name>\w+)?$', 'group_add', {}, name='group_add'),
url(r'^group/list/?$', 'group_list', {}, name='group_list'),
url(r'^group/(?P<group_id>\d+)/?$', 'group_detail', {}, name='group_detail'),
url(r'^group/search/?$', 'group_search', {}, name='group_search'),
url(r'^group/(?P<group_id>\d+)/join/?$', 'group_join', {}, name='group_join'),
url(r'^group/(?P<group_id>\d+)/leave/?$', 'group_leave', {}, name='group_leave'),
- #url(r'^group/(?P<group_id>\d+)/request/approval/?$', 'group_approval_request', {}, name='group_approval_request'),
url(r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/approve/?$', 'approve_member', {}, name='approve_member'),
url(r'^group/(?P<group_id>\d+)/(?P<user_id>\d+)/disapprove/?$', 'disapprove_member', {}, name='disapprove_member'),
url(r'^group/create/?$', 'group_create_list', {}, name='group_create_list'),
# or implied, of GRNET S.A.
import logging
+import calendar
from urllib import quote
from functools import wraps
from astakos.im.settings import (COOKIE_NAME, COOKIE_DOMAIN, SITENAME, LOGOUT_NEXT,
LOGGING_LEVEL
)
+from astakos.im.tasks import request_billing
logger = logging.getLogger(__name__)
* LOGIN_URL: login uri
* ASTAKOS_DEFAULT_CONTACT_EMAIL: service support email
- * ASTAKOS_DEFAULT_FROM_EMAIL: from email
"""
status = None
message = None
quota=request.user.quota
)
-@signed_terms_required
-@login_required
def group_create_list(request):
return render_response(
template='im/astakosgroup_create_list.html',
context_instance=get_context(request),
- )
\ No newline at end of file
+ )
+
+@signed_terms_required
+@login_required
+def billing(request):
+ today = datetime.today()
+ month_last_day = calendar.monthrange(today.year, today.month)[1]
+ start = datetime(today.year, today.month, 1).strftime("%s")
+ end = datetime(today.year, today.month, month_last_day).strftime("%s")
+ r = request_billing.apply(args=(request.user.email,
+ int(start) * 1000,
+ int(end) * 1000)
+ )
+ data = None
+ try:
+ status, data = r.result
+ if status != 200:
+ messages.error(request, _('Service response status: %d' % status))
+ except:
+ messages.error(request, r.result)
+ return render_response(
+ template='im/billing.html',
+ context_instance=get_context(request),
+ data = data
+ )
\ No newline at end of file
# Set the astakos main functions logging severity (None to disable)
#from logging import INFO
#ASTAKOS_LOGGING_LEVEL = INFO
+
+# Set the quota holder component URI
+#ASTAKOS_QUOTA_HOLDER_URL = ''
+
+# Set the billing URI
+#ASTAKOS_AQUARIUM_URL = ''
\ No newline at end of file
from setuptools import setup, find_packages
from astakos import get_version
-
HERE = os.path.abspath(os.path.normpath(os.path.dirname(__file__)))
try:
# try to update the version file
'django-recaptcha',
'django-ratelimit==0.1',
'commissioning',
- 'celery'
+ 'celery',
+ 'requests',
]
EXTRAS_REQUIRES = {