Revision a3530159

b/snf-astakos-app/astakos/im/models.py
1145 1145
        return self.filter(Q(state=ProjectApplication.PENDING)|\
1146 1146
                           Q(state=ProjectApplication.APPROVED))
1147 1147

  
1148
    def user_visible_by_last_of_chain(self, *filters, **kw_filters):
1149
        by_chain = self.user_visible_projects(*filters, **kw_filters).values('chain')
1150
        by_chain_min = [x['last_id'] for x in by_chain.annotate(last_id=models.Min('id'))]
1151
        return self.filter(id__in=by_chain_min)
1148
    def user_visible_by_chain(self, *filters, **kw_filters):
1149
        Q_PENDING = Q(state=ProjectApplication.PENDING)
1150
        Q_APPROVED = Q(state=ProjectApplication.APPROVED)
1151
        pending = self.filter(Q_PENDING).values_list('chain')
1152
        approved = self.filter(Q_APPROVED).values_list('chain')
1153
        by_chain = dict(pending.annotate(models.Max('id')))
1154
        by_chain.update(approved.annotate(models.Max('id')))
1155
        return self.filter(id__in=by_chain.values())
1152 1156

  
1153 1157
    def user_accessible_projects(self, user):
1154 1158
        """
......
1157 1161
        participates_filters = Q(owner=user) | Q(applicant=user) | \
1158 1162
                               Q(project__projectmembership__person=user)
1159 1163

  
1160
        return self.user_visible_by_last_of_chain(participates_filters).order_by('issue_date').distinct()
1164
        return self.user_visible_by_chain(participates_filters).order_by('issue_date').distinct()
1161 1165

  
1162 1166
    def search_by_name(self, *search_strings):
1163 1167
        q = Q()
......
1243 1247
        DENIED  : _('Denied')
1244 1248
    }
1245 1249

  
1250
    def get_project(self):
1251
        try:
1252
            project = Project.objects.get(id=self.chain, state=Project.APPROVED)
1253
            return Project
1254
        except Project.DoesNotExist, e:
1255
            return None
1256

  
1246 1257
    def state_display(self):
1247 1258
        return self.PROJECT_STATE_DISPLAY.get(self.state, _('Unknown'))
1248 1259

  
......
1363 1374
        now = datetime.now()
1364 1375
        project = self._get_project_for_update()
1365 1376

  
1366
        try:
1367
            # needs SERIALIZABLE
1368
            conflicting_project = Project.objects.get(name=new_project_name)
1369
            if (conflicting_project.is_alive and
1370
                conflicting_project != project):
1377
        if new_project_name != project.name:
1378
            try:
1379
                conflicting_project = Project.objects.get(
1380
                                                name=new_project_name,
1381
                                                is_active=True)
1371 1382
                m = (_("cannot approve: project with name '%s' "
1372 1383
                       "already exists (serial: %s)") % (
1373 1384
                        new_project_name, conflicting_project.id))
1374 1385
                raise PermissionDenied(m) # invalid argument
1375
        except Project.DoesNotExist:
1376
            pass
1386
            except Project.DoesNotExist:
1387
                pass
1377 1388

  
1378 1389
        new_project = False
1379 1390
        if project is None:

Also available in: Unified diff