From a61aff4662d6e60779171eaff1286d108dd86ff3 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Mon, 17 Feb 2014 00:40:43 +0100
Subject: [PATCH] Using more pythonic factories with classmethods

---
 src/cutecoin/core/__init__.py                 |  4 +-
 src/cutecoin/gui/addAccountDialog.py          |  4 +-
 src/cutecoin/models/account/__init__.py       | 38 ++++++++++++++++---
 .../models/account/communities/__init__.py    |  4 +-
 src/cutecoin/models/account/factory.py        | 38 -------------------
 .../models/account/wallets/__init__.py        |  4 +-
 src/cutecoin/models/community/__init__.py     | 34 ++++++++++++++---
 src/cutecoin/models/community/factory.py      | 27 -------------
 .../models/community/membersListModel.py      |  4 +-
 src/cutecoin/models/node/__init__.py          |  5 +++
 src/cutecoin/models/person/__init__.py        | 37 ++++++++++++++++--
 src/cutecoin/models/person/factory.py         | 36 ------------------
 src/cutecoin/models/transaction/__init__.py   |  1 -
 src/cutecoin/models/transaction/factory.py    |  7 ++--
 src/cutecoin/models/wallet/__init__.py        | 19 ++++++++--
 src/cutecoin/models/wallet/factory.py         | 21 ----------
 16 files changed, 129 insertions(+), 154 deletions(-)
 delete mode 100644 src/cutecoin/models/account/factory.py
 delete mode 100644 src/cutecoin/models/community/factory.py
 delete mode 100644 src/cutecoin/models/person/factory.py
 delete mode 100644 src/cutecoin/models/wallet/factory.py

diff --git a/src/cutecoin/core/__init__.py b/src/cutecoin/core/__init__.py
index 908b1a8d..7aa15265 100644
--- a/src/cutecoin/core/__init__.py
+++ b/src/cutecoin/core/__init__.py
@@ -10,7 +10,7 @@ import json
 
 from cutecoin.core import config
 from cutecoin.core.exceptions import KeyAlreadyUsed
-from cutecoin.models.account import factory
+from cutecoin.models.account import Account
 
 
 class Core(object):
@@ -57,7 +57,7 @@ class Core(object):
             json_data.close()
 
             for accountData in data['localAccounts']:
-                self.accounts.append(factory.loadAccount(accountData))
+                self.accounts.append(Account.load(accountData))
 
     def save(self):
         with open(config.parameters['data'], 'w') as outfile:
diff --git a/src/cutecoin/gui/addAccountDialog.py b/src/cutecoin/gui/addAccountDialog.py
index 32e04eee..3dcbca64 100644
--- a/src/cutecoin/gui/addAccountDialog.py
+++ b/src/cutecoin/gui/addAccountDialog.py
@@ -6,7 +6,7 @@ Created on 2 févr. 2014
 from cutecoin.gen_resources.addAccountDialog_uic import Ui_AddAccountDialog
 from PyQt5.QtWidgets import QDialog
 from cutecoin.gui.addCommunityDialog import AddCommunityDialog
-from cutecoin.models.account import factory
+from cutecoin.models.account import Account
 from cutecoin.models.account.communities import Communities
 from cutecoin.models.account.communities.listModel import CommunitiesListModel
 
@@ -39,7 +39,7 @@ class AddAccountDialog(QDialog, Ui_AddAccountDialog):
         for key in availableKeys:
             self.pgpKeysList.addItem(key['uids'][0])
 
-        self.account = factory.createAccount(availableKeys[0]['keyid'], "", Communities())
+        self.account = Account.create(availableKeys[0]['keyid'], "", Communities())
         self.pgpKeysList.setEnabled(True)
         self.pgpKeysList.currentIndexChanged[int].connect(self.keyChanged)
         self.communityDialog = AddCommunityDialog(self)
diff --git a/src/cutecoin/models/account/__init__.py b/src/cutecoin/models/account/__init__.py
index 3cf9917c..393bed91 100644
--- a/src/cutecoin/models/account/__init__.py
+++ b/src/cutecoin/models/account/__init__.py
@@ -10,7 +10,8 @@ import logging
 import json
 from cutecoin.models.account.wallets import Wallets
 from cutecoin.models.account.communities import Communities
-from cutecoin.models.transaction import factory as trxFactory
+from cutecoin.models.community import Community
+from cutecoin.models.transaction import factory
 
 class Account(object):
     '''
@@ -18,14 +19,39 @@ class Account(object):
     Each account has only one pgpKey, and a key can
     be locally referenced by only one account.
     '''
-    def __init__(self):
+    def __init__(self, pgpKeyId, name, communities, wallets):
         '''
         Constructor
         '''
-        self.pgpKeyId = ""
-        self.name = ""
-        self.communities = Communities()
-        self.wallets = Wallets()
+        self.pgpKeyId = pgpKeyId
+        self.name = name
+        self.communities = communities
+        self.wallets = wallets
+
+    @classmethod
+    def create(cls, pgpKeyId, name, communities):
+        '''
+        Constructor
+        '''
+        wallets = Wallets()
+        account = cls(pgpKeyId, name, communities, wallets)
+        for community in account.communities.communitiesList:
+            wallet = account.wallets.addWallet(community.currency)
+            wallet.refreshCoins(community, account.keyFingerprint())
+        return account
+
+    @classmethod
+    def load(cls, jsonData):
+        pgpKeyId = jsonData['pgpKeyId']
+        name = jsonData['name']
+        communities = Communities()
+        wallets = Wallets()
+        account = cls(pgpKeyId, name, communities, wallets)
+
+        for communityData in jsonData['communities']:
+            account.communities.communitiesList.append(Community.load(communityData, account))
+
+        return account
 
     def addWallet(name, currency):
         self.wallets.addWallet(name, currency)
diff --git a/src/cutecoin/models/account/communities/__init__.py b/src/cutecoin/models/account/communities/__init__.py
index 574a84d2..0e04bb60 100644
--- a/src/cutecoin/models/account/communities/__init__.py
+++ b/src/cutecoin/models/account/communities/__init__.py
@@ -4,7 +4,7 @@ Created on 5 févr. 2014
 @author: inso
 '''
 import ucoinpy as ucoin
-from cutecoin.models.community import factory
+from cutecoin.models.community import Community
 from cutecoin.core.exceptions import NotMemberOfCommunityError
 import logging
 
@@ -24,7 +24,7 @@ class Communities(object):
         Check if the pgpFingerprint is present in the community members list
         If its not, the account isnt added and an error is raised.
         '''
-        community = factory.createCommunity(mainNode)
+        community = Community.create(mainNode)
         members = community.ucoinRequest(ucoin.hdc.amendments.view.Members(community.amendmentId()))
 
         logging.debug("Account fingerprint : " + keyFingerprint)
diff --git a/src/cutecoin/models/account/factory.py b/src/cutecoin/models/account/factory.py
deleted file mode 100644
index 85971dfc..00000000
--- a/src/cutecoin/models/account/factory.py
+++ /dev/null
@@ -1,38 +0,0 @@
-'''
-Created on 11 févr. 2014
-
-@author: inso
-'''
-
-import logging
-
-from cutecoin.models.account import Account
-from cutecoin.models.account.wallets import Wallets
-from cutecoin.models.account.communities import Communities
-from cutecoin.models.wallet import factory as walletFactory
-from cutecoin.models.community import factory as communityFactory
-
-
-def createAccount(pgpKeyId, name, communities):
-    '''
-    Constructor
-    '''
-    account = Account()
-    account.pgpKeyId = pgpKeyId
-    account.name = name
-    account.communities = communities
-    account.wallets = Wallets()
-    for community in account.communities.communitiesList:
-        wallet = account.wallets.addWallet(community.currency)
-        wallet.refreshCoins(community, account.keyFingerprint())
-    return account
-
-def loadAccount(jsonData):
-    account = Account()
-    account.pgpKeyId = jsonData['pgpKeyId']
-    account.name = jsonData['name']
-    account.communities = Communities()
-    account.wallets = Wallets()
-    for communityData in jsonData['communities']:
-        account.communities.communitiesList.append(communityFactory.loadCommunity(communityData, account))
-    return account
\ No newline at end of file
diff --git a/src/cutecoin/models/account/wallets/__init__.py b/src/cutecoin/models/account/wallets/__init__.py
index eb13798c..05f7c806 100644
--- a/src/cutecoin/models/account/wallets/__init__.py
+++ b/src/cutecoin/models/account/wallets/__init__.py
@@ -4,7 +4,7 @@ Created on 7 févr. 2014
 @author: inso
 '''
 
-from cutecoin.models.wallet import factory
+from cutecoin.models.wallet import Wallet
 
 class Wallets(object):
     '''
@@ -22,7 +22,7 @@ class Wallets(object):
         This wallet must not already be present in the account,
         it means the wallet must have a different name or a different currency.
         '''
-        wallet = factory.createWallet(currency)
+        wallet = Wallet.create(currency)
         if wallet not in self.walletsList:
             self.walletsList.append(wallet)
         else:
diff --git a/src/cutecoin/models/community/__init__.py b/src/cutecoin/models/community/__init__.py
index 98b37e21..1dbfbe85 100644
--- a/src/cutecoin/models/community/__init__.py
+++ b/src/cutecoin/models/community/__init__.py
@@ -9,18 +9,43 @@ import hashlib
 import json
 import logging
 
+from cutecoin.models.node import MainNode
+from cutecoin.models.wallet import Wallet
+
 class Community(object):
     '''
     classdocs
     '''
-    def __init__(self):
+    def __init__(self, knownNodes):
         '''
         A community is a group of nodes using the same currency.
         They are all using the same amendment and are syncing their datas.
         An account is a member of a community if he is a member of the current amendment.
         '''
-        self.knownNodes = []
-        self.currency = ""
+        self.knownNodes = knownNodes
+        currentAmendment = self.ucoinRequest(ucoin.hdc.amendments.Current())
+        self.currency = currentAmendment['currency']
+
+    @classmethod
+    def create(cls, mainNode):
+        knownNodes = []
+        knownNodes.append(mainNode)
+        return cls(knownNodes)
+
+
+    @classmethod
+    def load(cls, jsonData, account):
+        knownNodes = []
+        for nodeData in jsonData['nodes']:
+            knownNodes.append(MainNode(nodeData['server'], nodeData['port']))
+
+        community = cls(knownNodes)
+
+        for walletsData in jsonData['wallets']:
+            account.wallets.walletsList.append(Wallet.load(walletsData, community))
+        return community
+
+
 
     def membersFingerprints(self):
         '''
@@ -35,8 +60,7 @@ class Community(object):
     def ucoinRequest(self, request, get_args={}):
         for node in self.knownNodes:
                 logging.debug("Trying to connect to : " + node.getText())
-                request.server = node.server
-                request.port = node.port
+                request = node.use(request)
                 return request.get(**get_args)
 
         raise RuntimeError("Cannot connect to any node")
diff --git a/src/cutecoin/models/community/factory.py b/src/cutecoin/models/community/factory.py
deleted file mode 100644
index 3576db72..00000000
--- a/src/cutecoin/models/community/factory.py
+++ /dev/null
@@ -1,27 +0,0 @@
-'''
-Created on 11 févr. 2014
-
-@author: inso
-'''
-from cutecoin.models.community import Community
-from cutecoin.models.node import MainNode
-from cutecoin.models.wallet import factory
-import ucoinpy as ucoin
-
-def createCommunity(mainNode):
-    community = Community()
-    community.knownNodes.append(mainNode)
-    currentAmendment = community.ucoinRequest(ucoin.hdc.amendments.Current())
-    community.currency = currentAmendment['currency']
-    return community
-
-
-def loadCommunity(jsonData, account):
-    community = Community()
-    for nodeData in jsonData['nodes']:
-        community.knownNodes.append(MainNode(nodeData['server'], nodeData['port']))
-    community.currency = jsonData['currency']
-    for walletsData in jsonData['wallets']:
-        account.wallets.walletsList.append(factory.loadWallet(walletsData, community))
-    return community
-
diff --git a/src/cutecoin/models/community/membersListModel.py b/src/cutecoin/models/community/membersListModel.py
index 855df3b3..70fdc0f4 100644
--- a/src/cutecoin/models/community/membersListModel.py
+++ b/src/cutecoin/models/community/membersListModel.py
@@ -4,7 +4,7 @@ Created on 5 févr. 2014
 @author: inso
 '''
 
-from cutecoin.models.person import factory
+from cutecoin.models.person import Person
 from PyQt5.QtCore import QAbstractListModel, Qt
 
 class MembersListModel(QAbstractListModel):
@@ -19,7 +19,7 @@ class MembersListModel(QAbstractListModel):
         fingerprints = community.membersFingerprints()
         self.members = []
         for f in fingerprints:
-            self.members.append(factory.createPerson(f, community))
+            self.members.append(Person.create(f, community))
 
     def rowCount(self ,parent):
         return len(self.members)
diff --git a/src/cutecoin/models/node/__init__.py b/src/cutecoin/models/node/__init__.py
index 0d2c5d8f..41337c1b 100644
--- a/src/cutecoin/models/node/__init__.py
+++ b/src/cutecoin/models/node/__init__.py
@@ -39,6 +39,11 @@ class MainNode(Node):
             peers.append(node)
         return peers
 
+    def use(self, request):
+        request.server = self.server
+        request.port = self.port
+        return request
+
     def jsonify(self):
         return {'server' : self.server,
                 'port' : self.port}
diff --git a/src/cutecoin/models/person/__init__.py b/src/cutecoin/models/person/__init__.py
index ad382abb..410d8192 100644
--- a/src/cutecoin/models/person/__init__.py
+++ b/src/cutecoin/models/person/__init__.py
@@ -5,6 +5,7 @@ Created on 11 févr. 2014
 '''
 
 import ucoinpy as ucoin
+from cutecoin.core.exceptions import PersonNotFoundError
 
 class Person(object):
     '''
@@ -13,10 +14,38 @@ class Person(object):
     '''
 
 
-    def __init__(self):
+    def __init__(self, name, fingerprint, email):
         '''
         Constructor
         '''
-        self.name = ""
-        self.fingerprint = ""
-        self.email = ""
\ No newline at end of file
+        self.name = name
+        self.fingerprint = fingerprint
+        self.email = email
+
+    @classmethod
+    def create(cls, pgpFingerprint, community):
+        '''
+        Create a person from the pgpFingerprint found in a community
+        '''
+        keys = community.ucoinRequest(ucoin.pks.Lookup(),
+                                          get_args={'search':"0x"+pgpFingerprint, 'op':'index'})['keys']
+        if len(keys) > 0:
+            json = keys[0]['key']
+            name = json['name']
+            fingerprint = json['fingerprint']
+            email = json['email']
+            return cls(name, fingerprint, email)
+        else:
+            raise PersonNotFoundError(pgpFingerprint, "pgpFingerprint", community)
+        return None
+
+    @classmethod
+    def fromJson(cls, jsonPerson):
+        '''
+        Create a person from json data
+        '''
+        name = jsonPerson['name']
+        pgpFingerprint = jsonPerson['fingerprint']
+        email = jsonPerson['email']
+        return cls(name, pgpFingerprint, email)
+
diff --git a/src/cutecoin/models/person/factory.py b/src/cutecoin/models/person/factory.py
deleted file mode 100644
index 6a47b8ba..00000000
--- a/src/cutecoin/models/person/factory.py
+++ /dev/null
@@ -1,36 +0,0 @@
-'''
-Created on 11 févr. 2014
-
-@author: inso
-'''
-from cutecoin.core.exceptions import PersonNotFoundError
-from cutecoin.models.person import Person
-import ucoinpy as ucoin
-
-
-def createPerson(pgpFingerprint, community):
-        '''
-        Create a person from the pgpFingerprint found in a community
-        '''
-        keys = community.ucoinRequest(ucoin.pks.Lookup(),
-                                          get_args={'search':"0x"+pgpFingerprint, 'op':'index'})['keys']
-        if len(keys) > 0:
-            person = Person()
-            json = keys[0]['key']
-            person.name = json['name']
-            person.fingerprint = json['fingerprint']
-            person.email = json['email']
-            return person
-        else:
-            raise PersonNotFoundError(pgpFingerprint, "pgpFingerprint", community)
-        return None
-
-def createPersonFromJson(jsonPerson):
-    '''
-    Create a person from json data
-    '''
-    person = Person()
-    person.name = jsonPerson['name']
-    person.pgpFingerprint = jsonPerson['fingerprint']
-    person.email = jsonPerson['email']
-    pass
\ No newline at end of file
diff --git a/src/cutecoin/models/transaction/__init__.py b/src/cutecoin/models/transaction/__init__.py
index 10c30221..5d69d5c2 100644
--- a/src/cutecoin/models/transaction/__init__.py
+++ b/src/cutecoin/models/transaction/__init__.py
@@ -6,7 +6,6 @@ Created on 1 févr. 2014
 
 import ucoinpy as ucoin
 from cutecoin.models.coin import Coin
-from cutecoin.models.person import factory
 
 class Transaction(object):
     '''
diff --git a/src/cutecoin/models/transaction/factory.py b/src/cutecoin/models/transaction/factory.py
index 38322b20..d36b11b2 100644
--- a/src/cutecoin/models/transaction/factory.py
+++ b/src/cutecoin/models/transaction/factory.py
@@ -5,9 +5,10 @@ Created on 12 févr. 2014
 '''
 import ucoinpy as ucoin
 
-from cutecoin.models.person import factory
+from cutecoin.models.person import Person
 from cutecoin.models.transaction import Transfer, Issuance
 
+#TODO: Passer par des factory + pythonic
 def createTransaction(senderFingerprint, increment, community):
     transactionId = senderFingerprint + "-" + str(increment)
     ucoinTransactionView = ucoin.hdc.transactions.View(transactionId)
@@ -21,7 +22,7 @@ def createTransaction(senderFingerprint, increment, community):
     if transaction != None:
         transaction.increment = increment
         transaction.community = community
-        transaction.sender = factory.createPerson(senderFingerprint, community)
-        transaction.recipient = factory.createPerson(ucoinTransaction['recipient'], community)
+        transaction.sender = Person.create(senderFingerprint, community)
+        transaction.recipient = Person.create(ucoinTransaction['recipient'], community)
 
     return transaction
diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py
index 8e0ebd70..2d46c9f2 100644
--- a/src/cutecoin/models/wallet/__init__.py
+++ b/src/cutecoin/models/wallet/__init__.py
@@ -15,15 +15,28 @@ class Wallet(object):
     '''
 
 
-    def __init__(self):
+    def __init__(self, coins, community):
         '''
         Constructor
         '''
-        self.coins = []
-        self.community = None
+        self.coins = coins
+        self.community = community
         self.name = "Main Wallet"
 
 
+    @classmethod
+    def create(cls, community):
+        return cls([], community)
+
+    @classmethod
+    def load(cls, jsonData, community):
+        coins = []
+        for coinData in jsonData['coins']:
+            coins.append(Coin.fromId(coinData['coin']))
+        return cls(coins, community)
+
+
+
     def __eq__(self, other):
         return ( self.community == other.community )
 
diff --git a/src/cutecoin/models/wallet/factory.py b/src/cutecoin/models/wallet/factory.py
deleted file mode 100644
index fca886d1..00000000
--- a/src/cutecoin/models/wallet/factory.py
+++ /dev/null
@@ -1,21 +0,0 @@
-'''
-Created on 11 févr. 2014
-
-@author: inso
-'''
-from cutecoin.models.wallet import Wallet
-from cutecoin.models.coin import Coin
-
-def createWallet(community):
-    wallet = Wallet()
-    wallet.community = community
-    return wallet
-
-
-def loadWallet(jsonData, community):
-    wallet = Wallet()
-    for coinData in jsonData['coins']:
-        wallet.coins.append(Coin.fromId(coinData['coin']))
-    wallet.community = community
-    return wallet
-
-- 
GitLab