Commit 9f25ede1 authored by Christos Stavrakakis's avatar Christos Stavrakakis

Merge branch 'release-0.15' into develop

Also, fix order of Pithos DB migrations.

Conflicts:
	Changelog
	docs/compute-api-guide.rst
	snf-astakos-app/astakos/im/tables.py
	snf-cyclades-app/synnefo/api/floating_ips.py
	snf-cyclades-app/synnefo/api/tests/floating_ips.py
	snf-cyclades-app/synnefo/api/tests/images.py
	snf-cyclades-app/synnefo/api/tests/servers.py
	snf-cyclades-app/synnefo/logic/subnets.py
	snf-cyclades-app/synnefo/plankton/backend.py
	snf-cyclades-app/synnefo/ui/static/snf/js/ui/web/ui_create_view.js
	snf-tools/synnefo_tools/burnin/cyclades_common.py
	version
parents 3d9f6cb1 118dfed0
......@@ -7,7 +7,7 @@ Since v0.13 most of the Synnefo components have been merged into a single
repository and have aligned versions.
v0.15next
=============
=========
Released: UNRELEASED
......@@ -73,10 +73,14 @@ Astakos
* Projects can be set `private', making it accessible only to its owner and
members.
v0.14next
=========
=======
.. _Changelog-0.15:
v0.15
=====
Released: Mon Mar 10 14:01:32 EET 2014
Released: UNRELEASED
Synnefo-wide
------------
......@@ -93,7 +97,7 @@ Synnefo-wide
and Astakos' ui service is under '_astakos/ui'.
* Add 'mail_admins' handler to 'django.request' logger in order to send email
notifactions to users listed in 'ADMINS' setting about unhandled exceptions
notifications to users listed in 'ADMINS' setting about unhandled exceptions
in the code.
* Extend astakosclient to request and validate OAuth 2.0 access tokens
......@@ -118,13 +122,11 @@ Astakos
* Improve recording of project, application, and membership actions.
* Implement API calls for projects.
* Store the base URL of a component. Deployer should provide it when adding
a new component. Service endpoints originating from a component are
expected to match its base URL; otherwise, a warning is issued.
Re-registration with `snf-component-register' affects both the base and
the ui URL.
* Changes in resource and quota handling:
* New resources are registered with unlimited default base quota,
......@@ -142,45 +144,46 @@ Astakos
* Remove API call GET /account/v1.0/authenticate in favor of
POST /identity/v2.0/tokens.
* Export basic statistics about Astakos service from '/admin/stats/detail' API
* Export basic statistics about Astakos service at the '/admin/stats/detail' API
endpoint. Access to this endpoint is only allowed to users that belong to
the Astakos groups that are defined in the
'ASTAKOS_ADMIN_STATS_PERMITTED_GROUPS' setting. Statistics are also availble
from 'snf-manage stats-astakos' management command.
'ASTAKOS_ADMIN_STATS_PERMITTED_GROUPS' setting. Statistics are also available
through the 'snf-manage stats-astakos' management command.
* Implement OAuth 2.0 Authorization Code Grant
Add API calls for authorization code and access token generation
* Add API call for validating OAuth 2.0 access tokens
* **Shibboleth module** Extract unique identifier from the
``REMOTE_USER`` header.
* Automatically fill third party signup form fields when available by the
the third party provider.
* Omit validation issues for non-required metadata values received from the
third party authentication provider.
* Automatically fill third-party signup form fields when available by the
the third-party provider.
* Management commands:
* Introduced new commands:
* component-show
* quota-list (replacing quota, supports various filters)
* quota-verify (replacing quota)
* oauth2-client-add (register OAuth 2.0 client)
* oauth2-client-list (list registered oauth 2.0 clients)
* oauth2-client-remove (remove OAuth 2.0 client)
* component-show
* quota-list (replacing quota, supports various filters)
* quota-verify (replacing quota)
* oauth2-client-add (register OAuth 2.0 client)
* oauth2-client-list (list registered oauth 2.0 clients)
* oauth2-client-remove (remove OAuth 2.0 client)
* Changed commands:
* component-add got options --base-url and --ui-url
* resource-modify --limit became --default-quota
* user-modify can operate on multiple users with --all and --exclude
* user-modify --set-base-quota became --base-quota
* component-add got options --base-url and --ui-url
* resource-modify --limit became --default-quota
* user-modify can operate on multiple users with --all and --exclude
* user-modify --set-base-quota became --base-quota
* Removed commands:
* quota
* resource-import (subsumed by service-import)
* resource-export-astakos (subsumed by service-export-astakos)
* quota
* resource-import (subsumed by service-import)
* resource-export-astakos (subsumed by service-export-astakos)
* Fix request authorization code failures due to Unicode issue:
https://code.grnet.gr/issues/4971
* Omit validation issues for non-required metadata values received from the
third-party authentication provider.
Cyclades
--------
......@@ -213,7 +216,7 @@ Cyclades
* Implement the 'resize' server action, to change the flavor of a server.
Only 'cpu' and 'memory' resizing is supported.
* Compute quotas for CPU and memory of running vms.
* Compute quotas for CPU and memory of running VMs.
* Change 'cyclades.cpu' and 'cyclades.ram' resources to represent the CPU
and RAM for running VMs. Total CPU and RAM usage is represented by new
......@@ -235,14 +238,14 @@ Cyclades
CYCLADES_SERVERS_FQDN to set the template for servers FDQN. Remove
'UI_VM_HOSTNAME_FORMAT' setting.
* Extend servers info API response with 'SNF:port_forwarding' attribute,
describing port fowarding rules (DNAT) that are applied to vms. The
describing port forwarding rules (DNAT) that are applied to vms. The
description of such rules is done via the new CYCLADES_PORT_FORWARDING
setting.
* Speed up server reconciliation, by performing parallel reconciliation for
each backend.
* Change --dhcp option of network management commands from a flag to a boolean
value, e.g. --dhcp=True
* Remove 'ARCHIPELAGO_BACKENDS' setting used to distinquish between backends
* Remove 'ARCHIPELAGO_BACKENDS' setting used to distinguish between backends
that hosted only archipelago backends. Instead allocation is based on which
disk-templates are enabled in each backend.
* Implement 'snf-manage server-remove' management command.
......@@ -253,10 +256,10 @@ Cyclades
* Do not automatically release externally reserved IPs if they are released
from a Ganeti backend. Management of externally reserved IPs must be
performed from Cyclades with 'network-modify' command.
* Export basic statistics about Cyclades Service from '/admin/stats/detail'
* Export basic statistics about Cyclades Service at the '/admin/stats/detail'
API endpoint. Access to this endpoint is only allowed to users that belong
to the Astakos groups that are defined in the 'ADMIN_STATS_PERMITTED_GROUPS'
setting. Statistics are also availble from 'snf-manage stats-cyclades'
setting. Statistics are also available through the 'snf-manage stats-cyclades'
management command.
* Support enforcing quota through command 'enforce-resources-cyclades'.
* Remove command 'resource-export-cyclades' subsumed by
......@@ -276,6 +279,11 @@ Cyclades
'snf-link-$network_id'.
* Extend flavors with 'allow_create' attribute. Flavors that have this
attribute unset cannot be used by users to create new servers.
* Store each image property(metadata) as a separate Pithos metadata and check
that the size of each property is valid.
* Fix a few occurrences of HTTP 500 errors being triggered due to insufficient
validation of incoming requests in the Network API
* Speed up some API calls by fixing the relevant DB queries
Cyclades UI
......@@ -316,6 +324,7 @@ Cyclades UI
to True.
- Setting ``UI_GROUPED_PUBLIC_NETWORK_NAME`` has been deprecated and no longer
used.
- Fix UI to filter available flavors in VM wizard
Cyclades Userdata
......@@ -356,6 +365,17 @@ Pithos
specific host
* Added new 'file-show' management command
* Remove command 'resource-export-pithos' subsumed by 'service-export-pithos'.
* Extend API to optionally enforce a specific content disposition type
in view and public requests: https://code.grnet.gr/issues/5019
* Fix bulk operation (delete/copy/move) failures in overpopulated
containers/folders: https://code.grnet.gr/issues/5119
* Fix performance issue due to missing index
* Fix backend open hashfile bug:
https://code.grnet.gr/issues/5011
* Fix GET request for public path with If-None-Match
https://code.grnet.gr/issues/5168
.. _Changelog-0.14.10:
......
......@@ -5,13 +5,114 @@ Unified NEWS file for Synnefo versions >= 0.13
Since v0.13 all Synnefo components have been merged into a single repository.
v0.14next
=======
.. _NEWS-0.15:
v0.15
=====
Released: Mon Mar 10 14:01:32 EET 2014
This release brings major new features and significant bug fixes across
Synnefo. All users are strongly encouraged to upgrade. Please see the Synnefo
documentation for upgrade instructions to v0.15.
Cyclades
--------
* Networking: Major improvements in the Network Service.
This release introduces a complete implementation of the OpenStack Networking
(Neutron) API v2.0, with distinct /networks, /ports, /subnets, and
/floatingips API endpoints, replacing the old Cyclades /networks API.
* Networking: Support the creation of arbitrary L2/L3 network topologies,
with IPv4-only, dual IPv4/IPv6 or IPv6-only functionality.
* Networking: Simplify network administration, support forced networking
configurations, e.g., a permanent management network across VMs.
* Networking: Introduce new CLI management commands for handling networks,
subnets, and ports.
* Networking: Support management of floating IPs as a distinct resource in
Cyclades. Users may create new IPs from admin-defined IP pools, attach
them to and detach them from VMs arbitrarily, and eventually release them.
* Compute: Support server resize, by changing server Flavors.
Extend the API and UI accordingly.
Support fine-grained, per-flavor control of resize and create actions
("allow_create" flavor attribute).
* Compute: Support finer-grained accounting of "Active CPUs", "Active RAM"
resources, in addition to "CPUs", "RAM". Active resources are those of
running VMs. This allows the administrator to limit currently used VM
resources to only a subset of the total allocated resources.
* Compute: Support NIC hotplugging. Allow addition and removal
of NICs on running VMs, without a reboot, to support on-the-fly network
reconfiguration, e.g., allocation of floating IPs, without the need for NAT.
* Compute: Speed up server reconciliation, by performing operations in parallel,
across Ganeti backends.
* Compute: Support running snf-vncauthproxy in distinct machine, with control
channel over TCP. This simplifies firewalling.
* UI: Numerous UI improvements, especially wrt Networking: Better handling
of multiple NICs per server, with multiple IPv4 and IPv6 addresses per NIC.
Introduce distinct "IP addresses" view. The "Create New Machine" wizard
has also been extended to support on-the-fly networking configuration of a
new machine.
* UI: Introduce distinct "SSH key" view.
* UI: Make Google fonts base URL configurable, to support running in networks
isolated from the public Internet.
* UI: Support consistent display of pending actions, e.g., "Shutting Down...",
or "Destroying...". Previously, they were reset upon page reload.
* UI: Support arbitrary groupings of public networks, based on their name.
* Quota: Support quota enforcement through new 'enforce-resource-cyclades'
management command with fine-grained, per-resource actions, to bring
current per-user resource usage within specified limits.
* Statistics: Export basic statistics at the /admin/stats/detail API endpoint.
Also make them available at the CLI.
* Administration: Support mixed DRBD/Archipelago-based Ganeti backends.
Previously, a Ganeti cluster was defined as Archipelago-only explicitly.
Pithos
------
* API: Numerous bugfixes and improvements across the codebase.
Improve handling of various corner cases, with better error reporting.
* UI: Support separate view/unsafe domain, for increased security.
Users may download their files from a specific view domain, distinct
from the API domain, to prevent malicious user content from accessing
cookies and other sensitive data set at the level of the API domain.
This uses newly-introduced support for OAuth2 tokens in Astakos.
Astakos
-------
* Projects: Improved project handling: Better logging of project, application,
and membership actions.
* Account API: The Account API has been extended to allow full programmatic
handling of projects.
* Authentication: Remove obsolete /account/v1.0/authenticate call
in favor of the standard POST /identity/v2.0/tokens Keystone API call.
* Authentication: Support OAuth 2.0 Authorization Code Grant, generate
and validate OAuth 2.0 access token. This is used by Pithos to support
distinct API and view/unsafe domains.
* Authentication: Support arbitrary attributes as unique identifiers, e.g.,
eduPersonTargetedId, or ePPN, by extracting them from the ``REMOTE_USER``
header. Also fill third-party signup form fields automatically.
* Administration: Introduce numerous new admin commands at the CLI,
simplify resource and user management commands.
* Resources: Finer-grained resource control, with individual setting of
resource visibility in the API, the UI, and Projects.
* Statistics: Export basic statistics at the /admin/stats/detail API endpoint.
Also make them available at the CLI.
Synnefo-wide
------------
Released: UNRELEASED
* Burnin tests: Significant improvements to the Synnefo Continuous Integration
mechanism (snf-burnin). It has been extended to also test the Pithos storage
service.
* Administration: Better error logging, and reporting across Synnefo.
Admins are notified by default, via email, whenever an unhandled exception
occurs in a Synnefo worker.
* Administration: Ganeti nodes no longer access the Pithos DB at all.
Previously, read-only access was required to support spawning VMs
from Images on Pithos. As of v0.15, Ganeti nodes only need read-only
access to the Pithos block store (NFS or RADOS).
* Support for snf-vncauthproxy-1.5 (drop support for older versions)
* Until release of v0.15, for complete list of changes see the Changelog.
.. _NEWS-0.14.10:
......
......@@ -2662,6 +2662,7 @@ Changelog, NEWS
===============
* v0.15 :ref:`Changelog <Changelog-0.15>`, :ref:`NEWS <NEWS-0.15>`
* v0.14.10 :ref:`Changelog <Changelog-0.14.10>`, :ref:`NEWS <NEWS-0.14.10>`
* v0.14.9 :ref:`Changelog <Changelog-0.14.9>`, :ref:`NEWS <NEWS-0.14.9>`
* v0.14.8 :ref:`Changelog <Changelog-0.14.8>`, :ref:`NEWS <NEWS-0.14.8>`
......
......@@ -15,12 +15,13 @@ for things that were missing or change frequently.
Most Synnefo services have a corresponding OpenStack API:
| Cyclades/Compute Service -> OpenStack Compute API
| Cyclades/Network Service -> OpenStack Neutron API
| Cyclades/Image Service -> OpenStack Glance API
| Pithos/Storage Service -> OpenStack Object Store API
| Astakos/Identity Service -> OpenStack Keystone API
| Cyclades/Network Service -> OpenStack Networking ("Neutron") API
| Cyclades/Image Service -> OpenStack Image ("Glance") API
| Pithos/Storage Service -> OpenStack Object Storage API
| Astakos/Identity Service -> OpenStack Identity ("Keystone") API
| Astakos/Quota Service -> Proprietary API
| Astakos/Resource Service -> Proprietary API
| Astakos/Project Service -> Proprietary API
Below, we will describe all Synnefo APIs with conjuction to the OpenStack APIs.
......@@ -29,7 +30,7 @@ Identity Service API (Astakos)
==============================
The Identity Management Service of Synnefo, which is part of Astakos, exposes
the OpenStack Keystone API.
the OpenStack Identity ("Keystone") API.
The current Astakos/Identity API is:
......@@ -80,7 +81,7 @@ Network Service API (Cyclades)
==============================
The Network Service is implemented inside Cyclades. It exposes the OpenStack
Neutron API.
Networking ("Neutron") API.
This is the Cyclades/Network API:
......@@ -94,7 +95,7 @@ Image Service API (Cyclades)
============================
The Image Service is implemented inside Cyclades. It exposes the OpenStack
Glance API with minor changes wherever needed.
Image ("Glance") API with minor changes wherever needed.
This is the Cyclades/Image API:
......@@ -147,15 +148,15 @@ which can be represented as folders or with other related icons:
organization of folders and files.
* The ``trash`` element, which contains files that have been marked for
deletion, but can still be recovered.
* The ``shared`` element, which contains all objects shared by the user to
other users of the system.
* The ``others`` element, which contains all objects that other users share
with the user.
* The ``shared by me`` element, which contains all objects shared by the
user to other users of the system.
* The ``shared with me`` element, which contains all objects that other users
share with the user.
* The ``groups`` element, which contains the names of groups the user has
defined. Each group consists of a user list. Group creation, deletion, and
manipulation is carried out by actions originating here.
* The ``history`` element, which allows browsing past instances of ``home``
and - optionally - ``trash``.
.. * The ``history`` element, which allows browsing past instances of ``home``
.. and - optionally - ``trash``.
Objects in Pithos can be:
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -27,7 +27,8 @@ Document Revisions
========================= ================================
Revision Description
========================= ================================
0.14 (Jun 18, 2013) Forbidden response for public listing by non path owners
0.15 (Feb 01, 2014) Optionally enforce a specific content disposition type.
0.14 (Jun 18, 2013) Forbidden response for public listing by non path owners.
0.14 (Apr 23, 2013) Reply with Merkle hash in the ETag if MD5 is not computed.
0.13 (Mar 27, 2013) Restrict public object listing only to the owner.
\ Do not propagate public URL information in shared objects.
......@@ -830,6 +831,7 @@ Request Parameter Name Value
format Optional extended reply type (can be ``json`` or ``xml``)
hashmap Optional request for hashmap (no value parameter)
version Optional version identifier or ``list`` (specify a format if requesting a list)
disposition-type Optional enforcement of the specific content disposition type (can be ``inline`` or ``attachement`` otherwise it is ignored - this will override the object's Content-Disposition)
====================== ===================================
The reply is the object's data (or part of it), except if a hashmap is requested with ``hashmap``, or a version list with ``version=list`` (in both cases an extended reply format must be specified). Object headers (as in a ``HEAD`` request) are always included.
......@@ -1149,7 +1151,15 @@ A user may ``GET`` another account or container. The result will include a limit
Shared objects that are also public do not expose the ``X-Object-Public`` meta information.
Objects that are marked as public, via the ``X-Object-Public`` meta, are also available at the corresponding URI returned for ``HEAD`` or ``GET``. Requests for public objects do not need to include an ``X-Auth-Token``. Pithos will ignore request parameters and only include the following headers in the reply (all ``X-Object-*`` meta is hidden):
Objects that are marked as public, via the ``X-Object-Public`` meta, are also available at the corresponding URI returned for ``HEAD`` or ``GET``. Requests for public objects do not need to include an ``X-Auth-Token``. Pithos will accept only the following request parameter:
====================== ===================================
Request Parameter Name Value
====================== ===================================
disposition-type Optional enforcement of the specific content disposition type (can be ``inline`` or ``attachement`` otherwise it is ignored - this will override the object's Content-Disposition)
====================== ===================================
and only include the following headers in the reply (all ``X-Object-*`` meta is hidden):
========================== ===============================
Reply Header Name Value
......
......@@ -23,7 +23,7 @@ form .form-row.submit { margin: 22px 0 ;}
form .form-row .extra-link { color: #808080; text-decoration: none; border: none; margin-top:15px; line-height:98%; display:inline-block; padding-top:15px; float: right; position:absolute; right:0; top:0; }
form .form-row .extra-link:hover { border-bottom:1px solid #9e9e9e;}
form .form-row label { font-size: 1.077em; }
form.innerlabels label { position: absolute; bottom: 11px; left: 1.5em; color: #808080 ; }
form.innerlabels label { display: none;}
form.innerlabels p { margin:0; position: relative;}
form.innerlabels p.p15px { font-size:1.154em;}
form.innerlabels p.p15px a { margin:0 5px;}
......@@ -229,3 +229,22 @@ form .refresh.open p:hover span.extra-img:hover { background-position: -33px -5
form.withlabels.upperlabels label { text-transform: uppercase;}
form.withlabels.upperlabels textarea { margin-top:10px;}
form.innerlabels input::-webkit-input-placeholder {
color: #808080;
font-style: normal;
}
form.innerlabels input:-moz-placeholder { /* Firefox 18- */
color: #808080;
font-style: normal;
}
form.innerlabels input::-moz-placeholder { /* Firefox 19+ */
color: #808080;
font-style: normal;
}
form.innerlabels input:-ms-input-placeholder {
color: #808080;
font-style: normal;
}
......@@ -283,7 +283,7 @@ dl.alt-style dd { overflow:hidden; position:relative;}
.projects dl.alt-style .dl-actions { position:absolute; left:300px;}
.projects form.members { margin-top:20px;}
.projects form.members label { padding-top:0; text-transform: uppercase;}
.my-projects .owner { display: none;}
/* new faq-userguide styles */
......
......@@ -398,17 +398,18 @@ $(document).ready(function() {
$('.hidden-submit .form-row.submit').slideDown(500);
});
setTimeout(function() {
var innerInputs = $('form.innerlabels input[type="text"], form.innerlabels input[type="password"]');
_.each(innerInputs, function(val, key,list){
if ($(val).val()){
$(val).siblings('label').css('opacity','0');
};
});
}, 200);
var innerInputs = $('form.innerlabels input[type="text"], form.innerlabels input[type="password"]');
_.each(innerInputs, function(val, key, list){
var txt = $(val).siblings('label').text();
$(val).attr('placeholder',txt);
});
$(function() {
$('input, textarea').placeholder();
});
// landing-page initialization
// landing-page initialization
if ($('.landing-page').length > 0) {
var wrapper = $(".landing-page");
var services = wrapper.find(".landing-service");
......
/*! http://mths.be/placeholder v2.0.7 by @mathias */
;(function(window, document, $) {
// Opera Mini v7 doesn’t support placeholder although its DOM seems to indicate so
var isOperaMini = Object.prototype.toString.call(window.operamini) == '[object OperaMini]';
var isInputSupported = 'placeholder' in document.createElement('input') && !isOperaMini;
var isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini;
var prototype = $.fn;
var valHooks = $.valHooks;
var propHooks = $.propHooks;
var hooks;
var placeholder;
if (isInputSupported && isTextareaSupported) {
placeholder = prototype.placeholder = function() {
return this;
};
placeholder.input = placeholder.textarea = true;
} else {
placeholder = prototype.placeholder = function() {
var $this = this;
$this
.filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
.not('.placeholder')
.bind({
'focus.placeholder': clearPlaceholder,
'blur.placeholder': setPlaceholder
})
.data('placeholder-enabled', true)
.trigger('blur.placeholder');
return $this;
};
placeholder.input = isInputSupported;
placeholder.textarea = isTextareaSupported;
hooks = {
'get': function(element) {
var $element = $(element);
var $passwordInput = $element.data('placeholder-password');
if ($passwordInput) {
return $passwordInput[0].value;
}
return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
},
'set': function(element, value) {
var $element = $(element);
var $passwordInput = $element.data('placeholder-password');
if ($passwordInput) {
return $passwordInput[0].value = value;
}
if (!$element.data('placeholder-enabled')) {
return element.value = value;
}
if (value == '') {
element.value = value;
// Issue #56: Setting the placeholder causes problems if the element continues to have focus.
if (element != safeActiveElement()) {
// We can't use `triggerHandler` here because of dummy text/password inputs :(
setPlaceholder.call(element);
}
} else if ($element.hasClass('placeholder')) {
clearPlaceholder.call(element, true, value) || (element.value = value);
} else {
element.value = value;
}
// `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
return $element;
}
};
if (!isInputSupported) {
valHooks.input = hooks;
propHooks.value = hooks;
}
if (!isTextareaSupported) {
valHooks.textarea = hooks;
propHooks.value = hooks;
}
$(function() {
// Look for forms
$(document).delegate('form', 'submit.placeholder', function() {
// Clear the placeholder values so they don't get submitted
var $inputs = $('.placeholder', this).each(clearPlaceholder);
setTimeout(function() {
$inputs.each(setPlaceholder);
}, 10);
});
});
// Clear placeholder values upon page reload
$(window).bind('beforeunload.placeholder', function() {
$('.placeholder').each(function() {
this.value = '';
});
});
}
function args(elem) {
// Return an object of element attributes
var newAttrs = {};
var rinlinejQuery = /^jQuery\d+$/;
$.each(elem.attributes, function(i, attr) {
if (attr.specified && !rinlinejQuery.test(attr.name)) {
newAttrs[attr.name] = attr.value;
}
});
return newAttrs;
}
function clearPlaceholder(event, value) {
var input = this;
var $input = $(input);
if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
if ($input.data('placeholder-password')) {
$input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id'));
// If `clearPlaceholder` was called from `$.valHooks.input.set`
if (event === true) {
return $input[0].value = value;
}
$input.focus();
} else {
input.value = '';
$input.removeClass('placeholder');
input == safeActiveElement() && input.select();
}
}
}
function setPlaceholder() {
var $replacement;
var input = this;
var $input = $(input);
var id = this.id;
if (input.value == '') {
if (input.type == 'password') {
if (!$input.data('placeholder-textinput')) {
try {
$replacement = $input.clone().attr({ 'type': 'text' });
} catch(e) {
$replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
}
$replacement
.removeAttr('name')
.data({
'placeholder-password': $input,
'placeholder-id': id
})
.bind('focus.placeholder', clearPlaceholder);
$input
.data({
'placeholder-textinput': $replacement,
'placeholder-id': id
})
.before($replacement);
}
$input = $input.removeAttr('id').hide().prev().attr('id', id).show();
// Note: `$input[0] != input` now!
}
$input.addClass('placeholder');
$input[0].value = $input.attr('placeholder');
} else {
$input.removeClass('placeholder');
}
}
function safeActiveElement() {
// Avoid IE9 `document.activeElement` of death
// https://github.com/mathiasbynens/jquery-placeholder/pull/99
try {
return document.activeElement;
} catch (err) {}
}
}(this, document, jQuery));
\ No newline at end of file
......@@ -263,6 +263,8 @@ class UserProjectsTable(UserTable):
members_count_f = tables.Column(verbose_name=_("Members"),
empty_values=(),
orderable=False)
owner = tables.Column(verbose_name=_("Owner"),
accessor='application.owner')
membership_status = tables.Column(verbose_name=_("Status"),
empty_values=(),
orderable=False)
......@@ -310,8 +312,8 @@ class UserProjectsTable(UserTable):
return mark_safe(str(members_count) + append)
class Meta:
sequence = ('name', 'membership_status', 'creation_date', 'end_date',
'members_count_f', 'project_action')
sequence = ('name', 'membership_status', 'owner', 'creation_date',
'end_date', 'members_count_f', 'project_action')
attrs = {'id': 'projects-list', 'class': 'my-projects alt-style'}
template = "im/table_render.html"
empty_text = _('No projects')
......@@ -352,9 +354,9 @@ class ProjectMembersTable(UserTable):
check = tables.Column(accessor="person.id", verbose_name=mark_safe(input),
orderable=False)
email = tables.Column(accessor="person.email", verbose_name=_('Email'),
orderable= False)
orderable=False)
status = tables.Column(accessor="state", verbose_name=_('Status'),
orderable= False)
orderable=False)
project_action = RichLinkColumn(verbose_name=_('Action'),
extra_context=member_action_extra_context,
orderable=False)
......
......@@ -48,7 +48,6 @@
<script src="{{ IM_STATIC_URL }}js/os.js"></script>