Revision a39b3e16

b/docs/admin-guide.rst
878 878
============================  ===========================
879 879
fix-superusers                Transform superusers created by syncdb into AstakosUser instances
880 880
cleanup-full                  Cleanup sessions and session catalog
881
invitation-list               List invitation
882
invitation-show               Show invitation details
883 881
project-control               Manage projects and applications
884 882
project-list                  List projects
885 883
project-show                  Show project details
......
904 902
authpolicy-show               Show authentication provider profile details
905 903
group-add                     Create a group with the given name
906 904
group-list                    List available groups
907
user-invite                   Invite somebody
908 905
user-list                     List users
909 906
user-modify                   Modify user
910 907
user-show                     Show user details
b/docs/astakos.rst
55 55
Invited user
56 56
~~~~~~~~~~~~
57 57

  
58
.. note::
59

  
60
   Invitation feature is currently disabled.
61

  
58 62
A registered ~okeanos user, invites student Alice to subscribe to ~okeanos
59 63
services. Alice receives an email and through a link is navigated to Astakos's
60 64
signup page. The system prompts her to select one of the available
/dev/null
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
from astakos.im.models import Invitation
35
from synnefo.webproject.management.commands import ListCommand
36

  
37
class Command(ListCommand):
38
    help = "List invitations"
39

  
40
    object_class = Invitation
41

  
42
    FIELDS = {
43
        "id": ("id", "The ID of the invitation"),
44
        "inviter": ("inviter.username", "The inviter of the invitation"),
45
        "username": ("username", "The receiver username"),
46
        "realname": ("realname", "The receiver name"),
47
        "code": ("code", "The code  of the invitation"),
48
        "is_consumed": ("is_consumed", "Whether the invitation is consumed or not"),
49
    }
50

  
51
    fields = ["id", "inviter", "username", "realname", "code", "is_consumed"]
/dev/null
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
from django.core.management.base import CommandError
35

  
36
from astakos.im.models import Invitation
37
from synnefo.webproject.management.commands import SynnefoCommand
38

  
39
from synnefo.webproject.management import utils
40

  
41

  
42
class Command(SynnefoCommand):
43
    args = "<invitation ID or code>"
44
    help = "Show invitation info"
45

  
46
    def handle(self, *args, **options):
47
        if len(args) != 1:
48
            raise CommandError("Please provide an invitation id")
49

  
50
        try:
51
            invitation = Invitation.objects.get(id=int(args[0]))
52
        except Invitation.DoesNotExist:
53
            try:
54
                invitation = Invitation.objects.get(code=args[0])
55
            except Invitation.DoesNotExist:
56
                raise CommandError("Unknown invitation id '%s'" % (args[0],))
57

  
58
        kv = {
59
            'id': invitation.id,
60
            'real name': invitation.realname,
61
            'email': invitation.username,
62
            'code': invitation.code,
63
            'consumed': invitation.is_consumed,
64
            'date created': invitation.created,
65
            'date consumed': invitation.consumed,
66
            'inviter real name': invitation.inviter.realname,
67
            'invitater email': invitation.inviter.email,
68
        }
69

  
70
        utils.pprint_table(self.stdout, [kv.values()], kv.keys(),
71
                           options["output_format"], vertical=True)
/dev/null
1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

  
34
from django.core.management.base import BaseCommand, CommandError
35
from django.db.utils import IntegrityError
36
from django.db import transaction
37

  
38
from ._common import get_user
39

  
40

  
41
@transaction.commit_manually
42
class Command(BaseCommand):
43
    args = "<inviter id or email> <email> <real name>"
44
    help = "Invite a user"
45

  
46
    def handle(self, *args, **options):
47
        if len(args) != 3:
48
            raise CommandError("Invalid number of arguments")
49

  
50
        inviter = get_user(args[0], is_active=True)
51
        if not inviter:
52
            raise CommandError("Unknown inviter")
53
        if not inviter.is_active:
54
            raise CommandError("Inactive inviter")
55

  
56
        if inviter.invitations > 0:
57
            email = args[1]
58
            realname = args[2]
59

  
60
            try:
61
                inviter.invite(email, realname)
62
                self.stdout.write("Invitation sent to '%s'\n" % (email,))
63
            except IntegrityError:
64
                transaction.rollback()
65
                raise CommandError(
66
                    "There is already an invitation for %s" % (email,))
67
            else:
68
                transaction.commit()
69
        else:
70
            raise CommandError("No invitations left")
b/snf-astakos-app/astakos/im/management/commands/user-show.py
102 102
                    ('last update', user.updated),
103 103
                    #('token', user.auth_token),
104 104
                    ('token expiration', user.auth_token_expires),
105
                    ('invitations', user.invitations),
106
                    ('invitation level', user.level),
107 105
                    ('providers', user.auth_providers_display),
108 106
                    ('verified', user.is_verified),
109 107
                    ('groups', [elem.name for elem in user.groups.all()]),

Also available in: Unified diff