1. La classe EquipsONG (4 punts)

Una ONG vol mantenir la informació dels projectes que està desenvolupant i de les persones que hi treballen. Implementareu la classe EquipsONG en un mòdul anomenat ong (fitxer ong.py). Cal tenir en compte el següent:

  • Tant els projectes com les persones s’identifiquen amb un string.

  • Cada persona només pot estar assignada a un sol projecte.

  • Un projecte és actiu si té almenys una persona assignada.

  • La representació interna serà un únic atribut públic, un diccionari on les claus són identificadors de projectes actius i els valors són conjunts (set) amb les persones assignades.

Especificació de la classe:

class ong.EquipsONG

Col·lecció de projectes actius d’una ONG. Inicialment no contindrà cap projecte.

Atributs públics:

projectes:

Diccionari amb els projectes actius; cada clau té associat el conjunt de persones assignades al projecte. Conté només projectes actius.

Mètodes:

conjunt_persones()

Retorna el conjunt persones assignades als projectes actius

assigna(idproj, idpers)

Afegeix la persona idpers al projecte idproj. Si el projecte idproj no existeix, l’afegeix. Si la persona idpers ja estava assignada a un altre projecte, no fa res.

esborra_projecte(idproj)

Elimina completament el projecte idproj, tant si estava actiu com si no (i per tant les persones del projecte queden desassignades).

desassigna(idproj, idpers)

Desassigna la persona idpers del projecte idproj. Si idproj no està actiu o bé si idpers no està assignada al projecte idproj, no fa res. Si després de fer la desassignació el projecte queda sense persones assignades, deixa d’estar actiu i per tant cal eliminar-lo.

Operacions:

Operació

Resultat

len(e)

Nombre de projectes actius de la ONG

e[idp]

Llista ordenada de persones assignades al projecte idp. Llista buida si el projecte no està actiu

Exemples d’ús:

>>> from ong import EquipsONG

--ini-enunciat

>>> e = EquipsONG()
>>> e.projectes
{}
>>> len(e)
0
>>> e['p1']
[]
>>> e.assigna('p1', 'ana')
>>> e.assigna('p1', 'joan')
>>> e['p1']
['ana', 'joan']
>>> e.assigna('p2', 'marta')
>>> len(e)
2
>>> sorted(e.projectes.keys())
['p1', 'p2']
>>> e.conjunt_persones() == {'ana', 'joan', 'marta'}
True
>>> e.assigna('p3', 'ana')  # 'ana' ja era a 'p1'
>>> 'p3' in e.projectes
False
>>> 'ana' in e['p1']
True
>>> e.assigna('p1', 'ana') # Assignar la mateixa persona al mateix projecte no canvia res
>>> e['p1']
['ana', 'joan']
>>> e.desassigna('p1', 'ana') # Desassignar persona existent
>>> e['p1']
['joan']
>>> e.desassigna('p1', 'joan') # Desassignar última persona elimina el projecte
>>> e['p1']
[]
>>> len(e)  # només queda p2
1
>>> e.esborra_projecte('p2') # Esborrar l'únic projecte existent
>>> len(e)
0

Disposeu de jocs de prova al fitxer tests-equips.txt