File size: 4,739 Bytes
c3b5b29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# tools/dsa_trusted_flaggers_log.py

import re
from datetime import datetime
from fpdf import FPDF
import gradio as gr
from langdetect import detect

# === PDF Export ===
def export_text_to_pdf(text, metadata=None, output_path=None, language="en"):
    if output_path is None:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_path = f"dsa_trusted_flaggers_log_{timestamp}.pdf"

    pdf = FPDF()
    pdf.add_page()
    pdf.set_auto_page_break(auto=True, margin=15)

    # Title
    pdf.set_font("Arial", 'B', 16)
    pdf.set_text_color(0, 51, 102)
    pdf.cell(0, 15, "Trusted Flaggers Activity Log", ln=True, align='C')
    pdf.ln(8)

    # Metadata
    if metadata:
        pdf.set_font("Arial", '', 12)
        pdf.set_text_color(90, 90, 90)
        pdf.multi_cell(0, 10, f"Organization: {metadata.get('organization', 'N/A')}")
        pdf.multi_cell(0, 10, f"Completed by: {metadata.get('completed_by', 'N/A')} ({metadata.get('role', 'N/A')})")
        pdf.multi_cell(0, 10, f"Timestamp: {metadata.get('timestamp', 'N/A')}")
        pdf.ln(5)

    # Body
    pdf.set_font("Arial", '', 12)
    pdf.set_text_color(0, 0, 0)
    for line in text.strip().split('\n'):
        line = line.strip()
        if line.startswith("## "):
            section = line.replace("## ", "").strip()
            pdf.set_font("Arial", 'B', 13)
            pdf.set_text_color(30, 30, 120)
            pdf.ln(6)
            pdf.cell(0, 10, section, ln=True)
            pdf.set_font("Arial", '', 12)
            pdf.set_text_color(0, 0, 0)
        elif line.startswith("- **"):
            match = re.match(r"- \*\*(.+?)\*\*: (.+)", line)
            if match:
                label, answer = match.groups()
                pdf.set_font("Arial", 'B', 12)
                pdf.cell(0, 10, f"{label}:", ln=True)
                pdf.set_font("Arial", '', 12)
                pdf.multi_cell(0, 10, answer)
        else:
            pdf.multi_cell(0, 10, line)

    pdf.output(output_path)
    return output_path

# === Questions ===
QUESTIONS = [
    ("organization", "What is the name of your organization?"),
    ("completed_by", "Who is completing this log?"),
    ("role", "What is your role?"),
    ("flagger_name", "What is the name of the trusted flagger?"),
    ("flag_reason", "What content was flagged and why?"),
    ("date_flagged", "When was the flag submitted?"),
    ("response_action", "What action was taken in response?"),
    ("timeline", "What was the timeline for the resolution?"),
    ("escalation", "Was the case escalated to another authority?")
]

def get_questions():
    return QUESTIONS

# === Run Tool ===
def run_tool():
    state = {"step": 0, "answers": {}}

    def step_by_step_agent(user_input, state):
        step = state["step"]
        answers = state["answers"]
        if step > 0:
            key, _ = QUESTIONS[step - 1]
            answers[key] = user_input

        if step < len(QUESTIONS):
            next_q = QUESTIONS[step][1]
            state["step"] += 1
            return next_q, state, None

        content = "\n".join([f"- **{label}**: {answers.get(key, '')}" for key, label in QUESTIONS])

        try:
            lang = detect(content) if len(content.strip()) > 3 else "en"
        except:
            lang = "en"

        metadata = {
            "organization": answers.get("organization"),
            "completed_by": answers.get("completed_by"),
            "role": answers.get("role"),
            "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        }

        pdf_path = export_text_to_pdf(content, metadata=metadata, language=lang)
        return "✅ Trusted flagger log completed. Download below.", {"done": True}, pdf_path

    with gr.Blocks(title="Trusted Flagger Log Tool") as demo:
        chatbot = gr.Chatbot(label="🚩 Trusted Flaggers Log", value=[{"role": "assistant", "content": QUESTIONS[0][1]}], type="messages")
        msg = gr.Textbox(label="Your answer")
        state_var = gr.State(state)
        file_output = gr.File(label="Download PDF")
        reset_btn = gr.Button("🔁 Restart")

        def chat_logic(msg_in, state_in):
            reply, updated_state, file = step_by_step_agent(msg_in, state_in)
            messages = [{"role": "user", "content": msg_in}]
            if reply:
                messages.append({"role": "assistant", "content": reply})
            return messages, updated_state, file

        def reset():
            return [{"role": "assistant", "content": QUESTIONS[0][1]}], {"step": 0, "answers": {}}, None

        msg.submit(chat_logic, [msg, state_var], [chatbot, state_var, file_output])
        reset_btn.click(reset, outputs=[chatbot, state_var, file_output])

    demo.launch(show_api=False)