{{tag>Python git Web}} = Notes git Trac * http://trac.edgewall.org/ticket/2911 * https://trac-hacks.org/wiki/SimpleMultiProjectPlugin * https://trac-hacks.org/wiki/PrivateTicketsPlugin * https://trac-hacks.org/wiki/RestrictedAreaPlugin * https://trac-hacks.org/browser/crystalxtheme/trunk/crystalxtheme * http://trac.edgewall.org/wiki/TracWorkflow * https://trac-hacks.org/wiki/AccountManagerPlugin ** Renommer un compte ** Création d'un admin pour la gestion de compte (ACCTMGR_USER_ADMIN) différent de TRAC_ADMIN http://trac.edgewall.org/ Voir plugins : * http://trac.edgewall.org/wiki/PluginList * https://trac-hacks.org/browser * https://github.com/trac-hacks * https://trac-hacks.org/wiki/XmlRpcPlugin Pour les tickets voir aussi : * https://en.m.wikipedia.org/wiki/OTRS apt-cache search trac | grep ^trac- | grep -v 'transitional dummy package' Bugs : * https://trac-hacks.org/ticket/12301 Besoin : * Groupes * Ticket Parent / Enfant * Notification par mail * Traduction complète en français ** Traduction Workflow ** http://trac.edgewall.org/ticket/9472 ** http://trac.edgewall.org/ticket/9799 == Install Dépendance # ​pysqlite ​setuptools ​Genshi babel docutils Pygments​ pytz sudo apt-get install python-pysqlite2 apache2-utils sqlite3 python-setuptools easy_install --user pip export PATH=$PATH:$HOME/.local/bin pip install --user --upgrade pip pip install --user Genshi babel docutils Pygments pytz pip install --user trac trac-admin projet1 initenv cd projet1 htpasswd -c .htpasswd jean trac-admin /home/jean/trac/projet1 permission add jean TRAC_ADMIN Lancement tracd -p 8000 --pidfile=/var/run/z_trac-8000.pid --basic-auth="projet1,projet1/.htpasswd,acme.fr" --protocol=http -s ~/projet1 ''trac.ini'' [trac] repository_type = git repository_dir = /home/jean/trac/repo/.git [components] tracopt.versioncontrol.git.* = enabled [logging] log_level = WARN On efface les pages Wiki par défaut trac-admin ~/trac/projet1 'wiki remove *' Config compte utilisateur Jean trac-admin ~/trac/projet1 'session set email jean jean@acme.fr' trac-admin ~/trac/projet1 'session set name jean "Prenom NOM"' Un peu de français trac-admin ~/trac/projet1 'ticket_type change task Tâche' trac-admin ~/trac/projet1 'ticket_type change defect Incident' trac-admin ~/trac/projet1 'ticket_type change enhancement Amélioration' trac-admin ~/trac/projet1 'priority change blocker Bloquant' trac-admin ~/trac/projet1 'priority change critical Critique' trac-admin ~/trac/projet1 'priority change major Majeur' trac-admin ~/trac/projet1 'priority change minor Mineur' trac-admin ~/trac/projet1 'resolution change fixed Résolut' trac-admin ~/trac/projet1 'resolution change wontfix Rejeté' trac-admin ~/trac/projet1 'resolution change duplicate Doublon' Racine du site sur Wiki, ou Ticket ou autre ''trac.ini'' [trac] #default_handler = TicketModule default_handler = WikiModule === Changement des droits par défauts trac-admin trac/projet1 'permission remove anonymous BROWSER_VIEW' trac-admin trac/projet1 'permission remove anonymous CHANGESET_VIEW' trac-admin trac/projet1 'permission remove anonymous FILE_VIEW' trac-admin trac/projet1 'permission remove anonymous LOG_VIEW' trac-admin trac/projet1 'permission remove anonymous MILESTONE_VIEW' trac-admin trac/projet1 'permission remove anonymous REPORT_SQL_VIEW' trac-admin trac/projet1 'permission remove anonymous REPORT_VIEW' trac-admin trac/projet1 'permission remove anonymous ROADMAP_VIEW' trac-admin trac/projet1 'permission remove anonymous SEARCH_VIEW' trac-admin trac/projet1 'permission remove anonymous TICKET_VIEW' trac-admin trac/projet1 'permission remove anonymous TIMELINE_VIEW' #trac-admin trac/projet1 'permission remove anonymous WIKI_VIEW' trac-admin trac/projet1 'permission add authenticated TICKET_VIEW' #trac-admin trac/projet1 'permission add authenticated WIKI_VIEW' trac-admin trac/projet1 'permission add jean BROWSER_VIEW' trac-admin trac/projet1 'permission add jean CHANGESET_VIEW' trac-admin trac/projet1 'permission add jean FILE_VIEW' trac-admin trac/projet1 'permission add jean LOG_VIEW' trac-admin trac/projet1 'permission add jean MILESTONE_VIEW' trac-admin trac/projet1 'permission add jean REPORT_SQL_VIEW' trac-admin trac/projet1 'permission add jean REPORT_VIEW' trac-admin trac/projet1 'permission add jean ROADMAP_VIEW' trac-admin trac/projet1 'permission add jean SEARCH_VIEW' trac-admin trac/projet1 'permission add jean TICKET_VIEW' trac-admin trac/projet1 'permission add jean TIMELINE_VIEW' # Autoriser tous les utilisateurs authentifié à changer le champ Description des tickets trac-admin ~/trac/projet1 'permission add authenticated TICKET_EDIT_DESCRIPTION' # Autoriser l'utilisateur jean à modifier les commentaires des tickets trac-admin ~/trac/projet1 'permission add jean TICKET_EDIT_COMMENT' ==== Gestion plus fine des droits Installation PrivateTicketsPlugin easy_install -Z -U --user https://trac-hacks.org/svn/privateticketsplugin/ ''trac.ini'' [privatetickets] group_blacklist = anonymous, authenticated, labusers [components] privatetickets.* = enabled [trac] permission_policies = PrivateTicketsPolicy, DefaultPermissionPolicy, LegacyAttachmentPolicy # Il faut garder TICKET_VIEW ! # permission remove authenticated TICKET_VIEW # Il faut aussi garder TICKET_MODIFY si l'utilisateur doit pouvoir éditer ses tickets # permission remove authenticated TICKET_MODIFY trac-admin trac/projet1 'permission add authenticated TICKET_VIEW_OWNER' trac-admin trac/projet1 'permission add authenticated TICKET_VIEW_SELF' === Logo Placer logo.png dans projet1/htdocs/logo.png ''trac.ini'' [header_logo] alt = ACME logo height = 53 link = /report/8 src = site/logo.png width = 393 == Thème Cacher les liens vers le guide d'utilisation.\\ Ne pas montrer les différents liens vers les pages d'aide. Ceci permet de réduire la verbosité des pages. Hide help links. Don't show the various help links. This reduces the verbosity of the pages. http://trac.edgewall.org/ticket/2911 == Config derrière Nginx en proxy Voir : * http://trac.edgewall.org/wiki/TracNginxRecipe Bloquons le port depuis extérieure iptables -A INPUT -i venet0 -p tcp -m tcp --dport 8000 -j REJECT Pour rendre les règles persistantes apt-get install iptables-persistent ''/etc/nginx/sites-available/trac'' upstream trac_backend { server 127.0.0.1:8000; #server 127.0.0.1:8001; #server 127.0.0.1:8002; } server { listen 80; server_name trac.acme.fr ; access_log /var/log/nginx/trac-acme.log ; error_log /var/log/nginx/trac-acme-error.log info; location / { rewrite ^/(.*)$ https://trac.acme.fr/$1 redirect; } } server { listen 443; server_name trac.acme.fr; access_log /var/log/nginx/trac-acme-ssl.log ; error_log /var/log/nginx/trac-acme-ssl-error.log info; client_max_body_size 4M; ssl on; ssl_certificate /etc/ssl/private/wiki.acme.fr.crt; ssl_certificate_key /etc/ssl/private/wiki.acme.fr.key; ssl_session_timeout 5m; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ALL:!aNULL:!eNULL:!LOW:!EXP:!RC4:!3DES:+HIGH:+MEDIUM; ssl_dhparam /etc/ssl/private/dh2048.pem; add_header Strict-Transport-Security max-age=2678400; add_header Front-End-Https on; location / { proxy_pass http://trac_backend; include /etc/nginx/proxy_params; # my system doesn't have the proxy.conf file so I needed to add the following two lines to get redirects working: # proxy_set_header Host $host; } } ln -s /etc/nginx/sites-available/trac /etc/nginx/sites-enabled/ == Config des modules / extensions === TestManager http://sourceforge.net/projects/testman4trac/ Voir https://www.youtube.com/watch?v=BIi3QMT0rT4 Ordre d'installation des extensions # TracGenericClass # TracGenericWorkflow # TestManager == Gestion de plusieurs clients # Comme le plugin est sur un dépôt SVN nous avons besoin du /usr/bin/svn sudo apt-get install subversion # Dépendance de ce plugin sudo apt-get install python-lxml easy_install -Z -U --user https://trac-hacks.org/svn/clientsplugin/trunk/ == Désactivation création de liens camelCase ''trac.ini'' [wiki] ignore_missing_pages = true == Création d'une date d'échéance (deadline) Voir : * http://trac.edgewall.org/ticket/1942 * https://trac-hacks.org/wiki/TracCronPlugin#Ticketdeadlinetask === Création de champ personalisé Ce plugin est intégré dans la nouvelle version de Trac easy_install -U -Z --user https://trac-hacks.org/svn/customfieldadminplugin/0.11 ''trac.ini'' [components] customfieldadmin.* = enabled === Ajout d'un type Date https://trac-hacks.org/wiki/DateFieldPlugin easy_install -U -Z --user https://trac-hacks.org/svn/datefieldplugin/1.0/ ''trac.ini'' [components] datefield.* = enabled [ticket-custom] due_date = text due_date.date = true due_date.label = Echéance # special value works with 1.0 branch only #due_date.value = due_date.value = due_date.date_empty = true == Menu de navigation Désactiver une rubrique ''trac.ini'' [metanav] help = disabled about = disabled # Cache API link (XmlRpcPlugin) rpc = disabled [mainnav] roadmap = disabled Rubrique principale / Racine du site ''trac.ini'' [trac] #default_handler = WikiModule default_handler = TicketModule == Clients en ligne de commande Voir : * http://trac.edgewall.org/wiki/Clients === Cartman https://tamentis.com/projects/cartman/ pip install --user git+https://github.com/tamentis/cartman ~/.local/bin/cm help === Tracshell Voir : * https://code.google.com/p/tracshell/ easy_install --user pyyaml Droits en écriture requis sur /usr/local/bin pip install --user git+https://github.com/stefanv/tracshell-fixes == Programmation API Perl * https://metacpan.org/release/Trac-RPC Python 3 import xmlrpc.client server = xmlrpc.client.ServerProxy("https://user:P@ssw0rd@trac.acme.fr/login/xmlrpc") multicall = xmlrpc.client.MultiCall(server) print( server.ticket.query('max=0') ) for t in server.ticket.query('max=0&status!=closed,format=count'): print(t); server.ticket.get(5) server.system.listMethods() print(server.system.methodHelp('ticket.query')) Cloner un ticket import xmlrpc.client s = xmlrpc.client.ServerProxy("https://user:P@ssw0rd@trac.acme.fr/login/xmlrpc") ticket=s.ticket.get(30) summary=ticket[3]["summary"] description=ticket[3]["description"] del ticket[3]["summary"] del ticket[3]["description"] del ticket[3]["_ts"] del ticket[3]["time"] del ticket[3]["changetime"] s.ticket.create(summary, description, ticket[3], False, datetime.datetime.now() ) Obtenir la liste des tickets ayant une échéance #! /usr/bin/env python3 import datetime from operator import itemgetter, attrgetter import xmlrpc.client s = xmlrpc.client.ServerProxy("https://user:pass@trac.acme.fr/login/xmlrpc") Tickets = [] for num in s.ticket.query('max=0&due_date!=&status!=closed'): ticket=s.ticket.get(num); if 'due_date' in ticket[3].keys(): due_date=ticket[3]["due_date"] due_date=datetime.datetime.strptime(due_date, "%d/%m/%Y").strftime("%Y-%m-%d") else: due_date='' summary=ticket[3]["summary"] summary=summary.replace('\'', '') summary=summary.replace('"', '') summary=summary.replace(';', '') Tickets.append([num, due_date, summary]) for num, date, summary in sorted(Tickets, key=itemgetter(1), reverse=False): print(num, date, summary)