Revision 398a9604 snf-astakos-app/astakos/im/management/commands/project-show.py

b/snf-astakos-app/astakos/im/management/commands/project-show.py
41 41

  
42 42

  
43 43
class Command(SynnefoCommand):
44
    args = "<id or name>"
45
    help = """
46
    Show project details.
47

  
48
    Command comes in two forms:
49
        project-show <id>    Look up project by id
50

  
51
        project-show <name>  Look up all projects whose name
52
                             contains the given string
53
"""
44
    args = "<id>"
45
    help = "Show details for project (or application) <id>"
54 46

  
55 47
    option_list = SynnefoCommand.option_list + (
56 48
        make_option('--app',
......
63 55
                    action='store_true',
64 56
                    dest='pending',
65 57
                    default=False,
66
                    help=("For a given project, show also pending modifications"
67
                          "(applications), if any")
58
                    help=("For a given project, show also pending "
59
                          "modifications (applications), if any")
60
                    ),
61
        make_option('--members',
62
                    action='store_true',
63
                    dest='members',
64
                    default=False,
65
                    help=("Show a list of project memberships")
68 66
                    ),
69 67
    )
70 68

  
......
73 71
            raise CommandError("Please provide project ID or name")
74 72

  
75 73
        show_pending = bool(options['pending'])
74
        show_members = bool(options['members'])
76 75
        search_apps = options['app']
76
        self.output_format = options['output_format']
77 77

  
78
        name_or_id = args[0]
79
        is_id = name_or_id.isdigit()
80
        if is_id:
81
            name_or_id = int(name_or_id)
78
        id_ = args[0]
79
        try:
80
            id_ = int(id_)
81
        except ValueError:
82
            raise CommandError("id should be an integer value.")
82 83

  
83 84
        if search_apps:
84
            infolist = app_info(name_or_id, is_id)
85
            self.pprint_dict(app_info(id_))
85 86
        else:
86
            chains = get_chains(name_or_id, is_id)
87
            infolist = collect_info(chains, show_pending)
88

  
89
        if not infolist:
90
            kind = 'project application' if search_apps else 'project'
91
            field = 'id' if is_id else 'name'
92
            msg = "Unknown %s with %s '%s'" % (kind, field, name_or_id)
93
            raise CommandError(msg)
94

  
95
        first = True
96
        for info in infolist:
97
            if not first:
87
            state, project, app = get_chain_state(id_)
88
            self.pprint_dict(chain_fields(state, project, app))
89
            if show_members and project is not None:
98 90
                self.stdout.write("\n")
99
            else:
100
                first = False
101
            utils.pprint_table(self.stdout, [info.values()], info.keys(),
102
                               options["output_format"], vertical=True)
103

  
91
                fields, labels = members_fields(project)
92
                self.pprint_table(fields, labels)
93
            if show_pending and state in Chain.PENDING_STATES:
94
                self.stdout.write("\n")
95
                self.pprint_dict(app_fields(app))
104 96

  
105
def app_info(name_or_id, is_id):
106
    try:
107
        apps = ([ProjectApplication.objects.get(id=name_or_id)]
108
                if is_id
109
                else ProjectApplication.objects.search_by_name(name_or_id))
110
        return [app_fields(app) for app in apps]
111
    except ProjectApplication.DoesNotExist:
112
            return []
97
    def pprint_dict(self, d, vertical=True):
98
        utils.pprint_table(self.stdout, [d.values()], d.keys(),
99
                           self.output_format, vertical=vertical)
113 100

  
101
    def pprint_table(self, tbl, labels):
102
        utils.pprint_table(self.stdout, tbl, labels,
103
                           self.output_format)
114 104

  
115
def get_chains(name_or_id, is_id):
116
    if is_id:
117
        try:
118
            return [Chain.objects.get(chain=name_or_id)]
119
        except Chain.DoesNotExist:
120
            return []
121
    else:
122
        return Chain.objects.search_by_name(name_or_id)
123 105

  
106
def app_info(app_id):
107
    try:
108
        app = ProjectApplication.objects.get(id=app_id)
109
        return app_fields(app)
110
    except ProjectApplication.DoesNotExist:
111
        raise CommandError("Application with id %s not found." % app_id)
124 112

  
125
def collect_info(chains, pending):
126
    states = [chain.full_state() for chain in chains]
127 113

  
128
    infolist = []
129
    for state in states:
130
        infolist += (chain_fields(state, pending))
131
    return infolist
114
def get_chain_state(project_id):
115
    try:
116
        chain = Chain.objects.get(chain=project_id)
117
        return chain.full_state()
118
    except Chain.DoesNotExist:
119
        raise CommandError("Project with id %s not found." % project_id)
132 120

  
133 121

  
134
def chain_fields((s, project, app), request=False):
135
    l = []
136
    if project:
137
        l = [project_fields(s, project, app)]
138
        if request and s in Chain.PENDING_STATES:
139
            l.append(app_fields(app))
122
def chain_fields(state, project, app):
123
    if project is not None:
124
        return project_fields(state, project, app)
140 125
    else:
141
        l = [app_fields(app)]
142
    return l
126
        return app_fields(app)
143 127

  
144 128

  
145 129
def app_fields(app):
......
206 190
            ('total members', project.members_count()),
207 191
    ])
208 192

  
209
    memberships = project.projectmembership_set
210
    accepted = [str(m.person) for m in memberships.any_accepted()]
211
    requested = [str(m.person) for m in memberships.requested()]
212
    suspended = [str(m.person) for m in memberships.suspended()]
213

  
214
    if accepted:
215
        d['accepted members'] = ', '.join(accepted)
193
    return d
216 194

  
217
    if suspended:
218
        d['suspended members'] = ', '.join(suspended)
219 195

  
220
    if requested:
221
        d['membership requests'] = ', '.join(requested)
196
def members_fields(project):
197
    labels = ('member uuid', 'email', 'status')
198
    objs = project.projectmembership_set.select_related('person')
199
    memberships = objs.all().order_by('state', 'person__email')
200
    collect = []
201
    for m in memberships:
202
        user = m.person
203
        collect.append((user.uuid,
204
                       user.email,
205
                       m.state_display()))
222 206

  
223
    return d
207
    return collect, labels

Also available in: Unified diff