From fcb9a97f2bf9d37420c2842bc1d5132637053874 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 20:39:16 +0300
Subject: [PATCH 1/6] add TaigaReader class

---
 get_from_tagia.py | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/get_from_tagia.py b/get_from_tagia.py
index 3f33831..a36cc3b 100644
--- a/get_from_tagia.py
+++ b/get_from_tagia.py
@@ -20,12 +20,29 @@ class Person():
         self.bio = user.bio
         self.role_name = member.role_name[0],
 
-def get_users_from_taiga(host, username, password, project_slug):
+class TaigaReader():
     '''
-    function for connecting to taiga at host, with username and password
-    and getting information about users from project by project_slug
+    object to read information from taiga
     '''
-    api = TaigaAPI(host=host)
-    api.auth(username, password)
-    members = api.projects.get_by_slug(project_slug).list_memberships()
-    return [Person(member, api.users.get(member.user)) for member in members]
+
+    def __init__(self, taiga_config):
+        '''
+        Constructor to TaigaReader
+        '''
+        self._api = TaigaAPI(host=taiga_config['host'])
+        self._api.auth(taiga_config['username'], taiga_config['password'])
+
+    def create_person(self, member):
+        '''
+        Create Person with member and request to getting information from user
+        '''
+        user = api.users.get(member.user)
+        return Person(member, user)
+
+    def get_persons(self):
+        '''
+        function for connecting to taiga at host, with username and password
+        and getting information about users from project by project_slug
+        '''
+        members = api.projects.get_by_slug(project_slug).list_memberships()
+        return map(self.create_person, members)
-- 
GitLab


From 5477f989a71c47c994416059e5703c7559baa698 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 20:45:30 +0300
Subject: [PATCH 2/6] add link recording

---
 get_from_tagia.py |  3 +++
 main.py           | 19 ++++++++++++-------
 page_writer.py    |  5 +++++
 3 files changed, 20 insertions(+), 7 deletions(-)

diff --git a/get_from_tagia.py b/get_from_tagia.py
index a36cc3b..c39161a 100644
--- a/get_from_tagia.py
+++ b/get_from_tagia.py
@@ -20,6 +20,9 @@ class Person():
         self.bio = user.bio
         self.role_name = member.role_name[0],
 
+    def add_link(self, link):
+        self.link = link
+
 class TaigaReader():
     '''
     object to read information from taiga
diff --git a/main.py b/main.py
index 04d52f1..9c129ab 100644
--- a/main.py
+++ b/main.py
@@ -1,16 +1,21 @@
 from config import read_config
-from get_from_tagia import get_users_from_taiga
+from get_from_tagia import TaigaReader
 from page_writer import PageWriter
 
 taiga, wiki = read_config('config.ini')
-persons = get_users_from_taiga(
-    taiga['host'], taiga['username'],
-    taiga['password'], taiga['project_slug']
-)
-
+reader = TaigaReader(taiga)
 writer = PageWriter(wiki)
-for person in persons:
+
+persons_by_roles = dict()
+for person in reader.get_persons():
+    if not (person.role_name in persons_by_roles):
+        persons_by_roles[person.role_name] = []
+    persons_by_roles[person.role_name].append(person)
+
     is_succes, message = writer.write_person_page(person)
     if not is_succes:
         print(f'Page not created for: {person.username}, message: {message}')
+
+# writer.write_list_page(persons_by_roles)
+
 print('Pages created')
\ No newline at end of file
diff --git a/page_writer.py b/page_writer.py
index f6a9166..75fec48 100644
--- a/page_writer.py
+++ b/page_writer.py
@@ -41,4 +41,9 @@ class PageWriter():
         resp = self._client.execute(
             gql(query_text)
         )['pages']['create']['responseResult']
+        
+        link = ''
+        if resp['succeeded']:
+            link = self._path + person.user_name
+        person.set_link(link)
         return resp['succeeded'], resp['message']
-- 
GitLab


From 8cf003cb4a7f4862a7d6f1f9d7b87b60e7ef1948 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 20:46:18 +0300
Subject: [PATCH 3/6] adapt to relative link

---
 page_writer.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/page_writer.py b/page_writer.py
index 75fec48..d387cbd 100644
--- a/page_writer.py
+++ b/page_writer.py
@@ -44,6 +44,6 @@ class PageWriter():
         
         link = ''
         if resp['succeeded']:
-            link = self._path + person.user_name
+            link = './' + person.user_name
         person.set_link(link)
         return resp['succeeded'], resp['message']
-- 
GitLab


From 82464bf05a65c94bbac32d6d50a661f0841a5b38 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 20:48:04 +0300
Subject: [PATCH 4/6] fix bugs in get_from_taiga

---
 get_from_tagia.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/get_from_tagia.py b/get_from_tagia.py
index c39161a..8de3e1a 100644
--- a/get_from_tagia.py
+++ b/get_from_tagia.py
@@ -34,12 +34,13 @@ class TaigaReader():
         '''
         self._api = TaigaAPI(host=taiga_config['host'])
         self._api.auth(taiga_config['username'], taiga_config['password'])
+        self._project_slug = taiga_config['project_slug']
 
     def create_person(self, member):
         '''
         Create Person with member and request to getting information from user
         '''
-        user = api.users.get(member.user)
+        user = self._api.users.get(member.user)
         return Person(member, user)
 
     def get_persons(self):
@@ -47,5 +48,5 @@ class TaigaReader():
         function for connecting to taiga at host, with username and password
         and getting information about users from project by project_slug
         '''
-        members = api.projects.get_by_slug(project_slug).list_memberships()
+        members = self._api.projects.get_by_slug(self._project_slug).list_memberships()
         return map(self.create_person, members)
-- 
GitLab


From b7c0d2da3b4c637a51d54674f48630f41e018919 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 22:57:07 +0300
Subject: [PATCH 5/6] all changes in one commit...

---
 get_from_tagia.py | 10 ++++++----
 list_page.tmpl    |  8 ++++++++
 main.py           |  2 +-
 page_writer.py    | 17 +++++++++++++++--
 person_page.tmpl  |  2 +-
 5 files changed, 31 insertions(+), 8 deletions(-)
 create mode 100644 list_page.tmpl

diff --git a/get_from_tagia.py b/get_from_tagia.py
index 8de3e1a..178b75a 100644
--- a/get_from_tagia.py
+++ b/get_from_tagia.py
@@ -10,7 +10,7 @@ class Person():
     Person class for describing informatron about users to page writer
     '''
 
-    def __init__(self, member, user) -> (None):
+    def __init__(self, member, user, role_name) -> (None):
         '''
         Constructor to Person object
         '''
@@ -18,9 +18,9 @@ class Person():
         self.username = user.username
         self.photo = user.big_photo
         self.bio = user.bio
-        self.role_name = member.role_name[0],
+        self.role_name = role_name
 
-    def add_link(self, link):
+    def set_link(self, link):
         self.link = link
 
 class TaigaReader():
@@ -41,7 +41,9 @@ class TaigaReader():
         Create Person with member and request to getting information from user
         '''
         user = self._api.users.get(member.user)
-        return Person(member, user)
+        roles = self._api.projects.get_by_slug(self._project_slug).list_roles()
+        role_name = str(roles.get(id=member.role).name)
+        return Person(member, user, role_name)
 
     def get_persons(self):
         '''
diff --git a/list_page.tmpl b/list_page.tmpl
new file mode 100644
index 0000000..21da375
--- /dev/null
+++ b/list_page.tmpl
@@ -0,0 +1,8 @@
+# Список участников проектной школы
+{% for role, persons in persons_by_role.items() %}
+## {{role}}
+{% for person in persons %}
+* [{{person.full_name}}]({{person.link}})
+{% endfor %}
+---
+{% endfor %}
\ No newline at end of file
diff --git a/main.py b/main.py
index 9c129ab..b3f50bb 100644
--- a/main.py
+++ b/main.py
@@ -16,6 +16,6 @@ for person in reader.get_persons():
     if not is_succes:
         print(f'Page not created for: {person.username}, message: {message}')
 
-# writer.write_list_page(persons_by_roles)
+writer.write_list_page(persons_by_roles)
 
 print('Pages created')
\ No newline at end of file
diff --git a/page_writer.py b/page_writer.py
index d387cbd..ab61589 100644
--- a/page_writer.py
+++ b/page_writer.py
@@ -11,10 +11,12 @@ class PageWriter():
     def __init__(
         self, wiki_config,
         person_template='person_page.tmpl',
+        list_template='list_page.tmpl',
         query_template='query.tmpl'
     ):
         env = Environment(loader=FileSystemLoader('./'))
         self._user_template = env.get_template(person_template)
+        self._list_template = env.get_template(list_template)
         self._query_template = env.get_template(query_template)
         self._path = wiki_config['path']
         sample_transport=RequestsHTTPTransport(
@@ -37,13 +39,24 @@ class PageWriter():
             path=self._path + person.username,
             title=person.full_name
         )
-        print(query_text)
         resp = self._client.execute(
             gql(query_text)
         )['pages']['create']['responseResult']
         
         link = ''
         if resp['succeeded']:
-            link = './' + person.user_name
+            link = './' + person.username
         person.set_link(link)
         return resp['succeeded'], resp['message']
+
+    def write_list_page(self, persons_by_role, title='Список участников'):
+        content = self._list_template.render(persons_by_role=persons_by_role)
+        query_text = self._query_template.render(
+            content=_normalise_str(content),
+            path=self._path + 'list',
+            title=title
+        )
+        resp = self._client.execute(
+            gql(query_text)
+        )['pages']['create']['responseResult']
+        return resp['succeeded'], resp['message']
diff --git a/person_page.tmpl b/person_page.tmpl
index 716ed11..56e18d6 100644
--- a/person_page.tmpl
+++ b/person_page.tmpl
@@ -1,4 +1,4 @@
-# {{person.full_name}} {{person.full_name}}
+# {{person.full_name}} ({{person.role_name}})
 <img src='{{person.photo}}'>
 
 ---
-- 
GitLab


From 6262164dda6e393fec133009375847654c0d3329 Mon Sep 17 00:00:00 2001
From: Zergey Loshkarev <saloshkarev@miem.hse.ru>
Date: Fri, 2 Jul 2021 23:07:07 +0300
Subject: [PATCH 6/6] edit readme

---
 README.md | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 0116de9..84748ac 100644
--- a/README.md
+++ b/README.md
@@ -13,12 +13,21 @@ pip install -r requirements.txt
 # config.ini
 [taiga]
 host = https://track.miem.hse.ru/ # Адрес хоста
-username = *** # Логин/почта от тайги
+username = *** # Логин/почта от taiga
 password = *** # Пароль
 project_name = ps # slug проекта
+[wiki]
+url = https://wiki-dev.miem.vmnet.top/graphql # Адрес хоста
+token = *** # Токен для доступа к wiki
+path = ps/members4/ # Путь к создаваемым страницам в wiki (Важно, чтобы он заканчивался на '/')
+```
+
+Запустить проект
+```
+python main.py
 ```
 
 ## Возможные ошибки
 * Может возникнуть проблема с авторизацией в тайге, так как все акаунты внутри МИЭМ автоматически авторизовывались через gmail и пароля для тайги нет. Проблема решается добавлением пароля через настройки профиля в тайге
-
+* Страницы могут не создаться, если директория содержит файлы с одинаоквым путем
 
-- 
GitLab