import requests import base64 import getpass import csv

def get_auth_header(email, api_token): token = f”{email}:{api_token}” b64_token = base64.b64encode(token.encode()).decode() return {“Authorization”: f”Basic {b64_token}”, “Accept”: “application/json”}

def get_issues_with_worklog(base_url, user_email, headers): start_at = 0 max_results = 50 issues = []

print("Buscando issues com worklogs do usuário...")
while True:
    search_url = (
        f"{base_url}/rest/api/3/search?"
        f"jql=worklogAuthor={user_email}&fields=key&startAt={start_at}&maxResults={max_results}"
    )
    resp = requests.get(search_url, headers=headers)
    resp.raise_for_status()
    data = resp.json()
    issues.extend(data["issues"])

    if start_at + max_results >= data["total"]:
        break
    start_at += max_results

return [issue["key"] for issue in issues]

def get_user_worklogs(base_url, issue_keys, user_email, headers): logs = [] for key in issue_keys: url = f”{base_url}/rest/api/3/issue/{key}/worklog” resp = requests.get(url, headers=headers) resp.raise_for_status() data = resp.json()

    for wl in data["worklogs"]:
        author = wl["author"].get("emailAddress", "")
        if author.lower() == user_email.lower():
            logs.append({
                "issue": key,
                "started": wl["started"],
                "timeSpent": wl["timeSpent"],
                "comment": wl.get("comment", {}).get("content", [{}])[0].get("content", [{}])[0].get("text", ""),
            })
return logs

def export_to_csv(worklogs, filename=”worklogs.csv”): with open(filename, “w”, newline=””) as csvfile: fieldnames = [“issue”, “started”, “timeSpent”, “comment”] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for log in worklogs: writer.writerow(log) print(f”\nExportado para {filename}”)

if name == “main”: print(“=== Exportador de Worklogs do Jira ===”) base_url = input(“URL base do Jira (ex: https://empresa.atlassian.net): “).strip() email = input(“Seu e-mail Jira: “).strip() api_token = getpass.getpass(“Seu token da API: “).strip() target_user = input(“E-mail do usuário para buscar worklogs: “).strip()

headers = get_auth_header(email, api_token)
try:
    issues = get_issues_with_worklog(base_url, target_user, headers)
    print(f"{len(issues)} issues encontradas com worklogs do usuário.")

    worklogs = get_user_worklogs(base_url, issues, target_user, headers)
    print(f"{len(worklogs)} worklogs encontrados.")

    export_to_csv(worklogs)
except Exception as e:
    print("Erro ao buscar dados:", str(e))

Acho que depois de quase um ano utilizando o Omakub, e mais que isso, utilizando Linux como meu OS principal, valem algumas considerações:

Eu poderia editar o meu post antigo com as minhas observações, mas vou deixar eles originais como fontes de referência

  1. No post anterior eu deixo a entender que os MacBooks (na verdade eu queria dizer macOS) oferecem mais produtividade que os ambientes Linux. Hoje eu penso exatamente o contrário e tenho certeza de que o ferramental para o desenvolvedor é maior e mais fácil de usar nos ambientes Linux. Um exemplo é usar soluções como Docker e Podman. Estudando mais sobre como cgroups e namespaces funcionam, é um pouco decepcionante usar ambientes que não sejam de fato rodando Linux (kernel como principal, sem virtualizações para isso).
  2. Quando eu falo em “capacidades Unix-like”, na verdade o correto seria dizer compatível com POSIX.
  3. Não consigo imaginar mais trabalhar em um ambiente que não seja configurado de forma automatizada. Tive a infelicidade de perder dois SSDs recentemente, curiosamente das duas máquinas que tenho (meu notebook e no meu desktop) e voltar a atuar foi extremamente rápido, basicamente subir o SO em um SSD novo e rodar o setup do Omakub. A velocidade e padronização é muito significativa e reforça a ideia das máquinas serem apenas ambientes transientes - todos os dados importantes estão seguros e armazenados em outros repositórios como cloud storage, NAS, serviço de git, ou algo do tipo.
  4. Minha experiência no passado com Rails e agora com o Omakub só reforça a necessidade de padronizarmos e simplificarmos como algumas coisas devem ser feitas. Meus dois ambientes, tanto desktop quanto laptop são exatamente iguais em interface e software instalados. Não seria fácil fazer isso manualmente.
  5. Acredito que toda empresa que tenha times de dev precisa de um scripts similar ao Omakub. Se usá-lo diretamente é algo que possa trazer riscos, que seja adaptado e mantido por uma comunidade interna.