File size: 32,704 Bytes
dd2635a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
"""Generate the filled TETFund-IBR Application (URAAS) as a .docx file."""
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

OUT_PATH = r"c:\Users\hp\Downloads\crawler-unilag-apa\docs\IBR_Application_Form_2026_Filled.docx"

doc = Document()

# Base style
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)


def shade_cell(cell, color="D9E2F3"):
    tc_pr = cell._tc.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:val'), 'clear')
    shd.set(qn('w:color'), 'auto')
    shd.set(qn('w:fill'), color)
    tc_pr.append(shd)


def add_heading(text, level=1):
    h = doc.add_heading(text, level=level)
    return h


def add_boxed_text(text, bold_lead=None):
    table = doc.add_table(rows=1, cols=1)
    table.style = 'Table Grid'
    cell = table.rows[0].cells[0]
    cell.text = ""
    p = cell.paragraphs[0]
    if bold_lead:
        run = p.add_run(bold_lead)
        run.bold = True
    run2 = p.add_run(text)
    doc.add_paragraph("")
    return table


def add_numbered_section(number, title, content, box=True):
    p = doc.add_paragraph()
    run = p.add_run(f"{number}. {title}")
    run.bold = True
    run.font.size = Pt(12)
    if box:
        add_boxed_text(content)
    else:
        doc.add_paragraph(content)


# ---------- Header ----------
title_p = doc.add_paragraph()
title_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
for line in [
    "RESEARCH MANAGEMENT OFFICE",
    "OFFICE OF THE DEPUTY VICE CHANCELLOR (ACADEMICS & RESEARCH)",
    "TETFUND-IBR RESEARCH PROPOSAL APPLICATION TEMPLATE",
    "FEBRUARY, 2026",
]:
    r = title_p.add_run(line + "\n")
    r.bold = True

h = doc.add_heading("TETFUND-IBR APPLICATION TEMPLATE", level=0)
h.alignment = WD_ALIGN_PARAGRAPH.CENTER

# 1. Principal Researcher
p = doc.add_paragraph()
p.add_run("1. Principal Researcher (Details) ").bold = True
p.add_run("Dr. Titilayo Adedokun")

# 2. Research Team
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run("2. Research Team (Name/Rank/Highest Qualification/Area of specialization)").bold = True

team = [
    ["SN", "Name", "Rank", "Highest Qualification", "Area of Specialisation", "Telephone", "Email"],
    ["1", "Dr Titilayo Adedokun", "Senior Librarian", "Ph.D", "Library Science", "08060236246", "tadedokun@unilag.edu.ng"],
    ["2", "Olatokunbo Okiki", "Professor", "Ph.D.", "Library Science", "08028381337", "cokiki@unilag.edu.ng"],
    ["3", "Luqman Adams", "Professor", "Ph.D.", "University Ranking Data Provider", "08089953221", "ladams@unilag.edu.ng"],
    ["4", "Olufemi Agunbiade", "", "B.Sc.", "Data Analytics", "08066400594", "sagunbiade@unilag.edu.ng"],
    ["5", "Giyath Lawal", "Student", "Undergraduate", "Software Engineer", "08062679191", "giyathlawal@gmail.com"],
]
t = doc.add_table(rows=len(team), cols=7)
t.style = 'Table Grid'
for i, row in enumerate(team):
    for j, val in enumerate(row):
        cell = t.rows[i].cells[j]
        cell.text = val
        if i == 0:
            shade_cell(cell)
            for run in cell.paragraphs[0].runs:
                run.bold = True
doc.add_paragraph("")

# 3-9 straightforward boxed sections
add_numbered_section(3, "Title of Research Proposal [Not more than 20 words]",
    "Preservation of Indigenous Knowledge, Cultural Heritage and Innovations: The University "
    "Repository Archival & Analytics System (URAAS)")

add_numbered_section(4, "Estimated Duration for the Research", "9 months")

add_numbered_section(5, "Amount Requested",
    "₦ 4,889,529.5 (Four million, eight hundred eighty-nine thousand, five hundred twenty-nine "
    "point five)")

exec_summary = (
"This proposal outlines the development of the University Repository Archival & Analytics "
"System (URAAS), an innovative, enterprise-level digital asset management system designed to "
"preserve, curate, and analyse Indigenous Knowledge (IK), cultural heritage, and African "
"innovations within Nigerian universities, particularly the University of Lagos. The project is "
"submitted under the TETFund National Research Fund (NRF) 2026, within the thematic area of ICT "
"in Education and Library & Information Science.\n\n"
"Indigenous knowledge represents a critical intellectual and cultural resource embedded in local "
"traditions, oral histories, and community practices across Africa. However, this knowledge is "
"increasingly endangered due to globalization, urban migration, loss of custodians (elders), and "
"the predominance of oral transmission systems that lack formal documentation. Existing archival "
"practices are fragmented, externally controlled, and often fail to account for issues of "
"cultural sensitivity, intellectual property rights, and community ownership. Furthermore, "
"traditional and even many digital repositories are not adequately structured to capture the "
"complexity, contextual richness, and non-linear nature of indigenous knowledge systems.\n\n"
"To address these challenges, this project aims to design and implement URAASβ€”a "
"self-archiving, analytics-driven digital repository that integrates automated web crawling, "
"natural language processing (NLP), metadata enrichment, and advanced analytics. The system will "
"centralize scattered institutional research outputs and indigenous knowledge assets while "
"ensuring cultural compliance, data sovereignty, and long-term preservation. Unlike conventional "
"repositories, URAAS introduces a culturally responsive framework that incorporates multilingual "
"capabilities (e.g., Yoruba, Igbo, Hausa), community participation, and restricted access "
"protocols where necessary.\n\n"
"The specific objectives include: (1) developing an automated repository system to aggregate and "
"preserve institutional and indigenous knowledge assets; (2) safeguarding scholarly outputs "
"against data loss through robust digital preservation infrastructure; (3) enabling large-scale "
"metadata processing and analytics for strategic decision-making; and (4) generating data-driven "
"insights to inform institutional policies and research priorities.\n\n"
"Methodologically, the project will adopt a modular, microservices-based architecture combining "
"tools such as Django REST Framework, Elasticsearch, PostgreSQL, React.js, and Apache Superset. "
"The system will employ automated crawling technologies (Scrapy and Playwright) to harvest data "
"from institutional and external academic platforms, followed by NLP-based metadata enrichment "
"and duplicate detection. Validation processes will ensure technical integrity and cultural "
"compliance, while preservation strategies will include distributed storage across multiple "
"locations to guarantee long-term sustainability (minimum of 25 years).\n\n"
"The expected outcomes include: (i) a standardized Indigenous Knowledge Taxonomy and Metadata "
"Framework; (ii) a fully functional URAAS platform adaptable across Nigerian universities; (iii) "
"a repository populated with at least 5,000 indexed records; (iv) validated protocols for "
"cultural and intellectual property protection; (v) a sustainable digital preservation policy; "
"and (vi) analytics-driven reports to support institutional planning and national cultural "
"heritage strategies.\n\n"
"URAAS is highly innovative in three major ways: it is specifically designed for African "
"contexts and epistemologies; it integrates crawling, curation, and analytics into a unified "
"system; and it is built entirely on open-source technologies, ensuring scalability and "
"cost-effectiveness without reliance on proprietary platforms. This positions URAAS as a "
"transformative solution for strengthening research visibility, preserving cultural identity, "
"and advancing data-driven governance in Nigerian higher education."
)
add_numbered_section(6, "Executive Summary [Maximum of 600 words]", exec_summary)

introduction = (
"Indigenous knowledge (IK) is deeply rooted in the cultural and environmental contexts of "
"indigenous people. It covers indigenous peoples and local communities' long-standing "
"traditions, and intimate knowledge of local ecosystems, biodiversity, and social systems "
"developed over time (Berkes, 2009), including agriculture and healthcare (Whyte, 2017; Jessen "
"et al., 2022). This knowledge is often deeply embedded within cultural traditions, rituals, and "
"social structures in the form of textiles, paintings, writings, music, dance, and oral tradition "
"(Battiste, 2002). African innovations are often passed over without recognition as homegrown "
"solutions towards African sustainable development.\n\n"
"The trend of globalization, urbanization, and the erosion of traditional lifestyles has "
"significantly threatened the continuity of indigenous knowledge and cultural identity "
"preservation. The demise of knowledgeable elders in communities, lack of documentation or "
"inadequate archiving, transmittance in oral form, as well as marginalization of indigenous "
"communities, are factors contributing to the rapid disappearance and vulnerability to permanent "
"loss (UNESCO, 2017).\n\n"
"Digital technologies such as Digital Asset Management Systems (DAMS) provide structured "
"solutions for preserving and disseminating information through storing, organizing, retrieving, "
"and sharing digital content, including text, audio, video, and images (Gilliland, 2014). A "
"self-archiving digital asset management system simplifies documenting and preserving knowledge "
"while strengthening ownership, control, and accessibility, unlike traditional archiving "
"processes that are heavily reliant on manual input, leaving vast amounts of institutional "
"knowledge scattered, unindexed, and underutilized.\n\n"
"The goal of this study is to develop a self-archiving digital asset management system, "
"configured for analytics, that is tailored to curate indigenous knowledge, cultural heritage, "
"and innovations for sustainable impact."
)
add_numbered_section(7, "Introduction [Maximum of 500 words]", introduction)

problem = (
"Indigenous knowledge is at risk due to several interrelated challenges. Unfortunately, the "
"trend is a decline in cultural continuity as traditional oral methods of knowledge transmission "
"are increasingly disrupted by modernization, as younger generations migrate to urban areas "
"(Ngulube, 2002).\n\n"
"Similarly, existing documentation is often fragmented, externally driven, and lacks community "
"involvement, which raises concerns about intellectual property rights, cultural sensitivity, "
"and data ownership. Indigenous communities frequently have limited control over how knowledge "
"is recorded, stored, and shared (Smith, 2012).\n\n"
"The commonly adopted manual archiving approach exposes African communities and universities to "
"the risk of data loss, particularly because conventional digital repositories are not designed "
"to accommodate the unique characteristics of indigenous knowledge β€” oral traditions, "
"contextual meanings, and cultural restrictions (Christen, 2012) β€” thereby weakening "
"strategic research investments.\n\n"
"These challenges underscore the need for a customised self-archiving digital system that "
"ensures sustainable preservation while respecting cultural values and ownership rights."
)
add_numbered_section(8, "Statement of the Problem / Justification [Maximum of 500 words]", problem)

objectives = (
"The aim of this study is to design and develop a self-archiving-analytics digital asset "
"management system for curating, preserving and evaluating the impact of indigenous knowledge, "
"cultural heritage and the economic value of African innovations.\n\n"
"The specific objectives are to:\n"
"1. Develop and deploy URAAS as an enterprise-level, automated web crawler to centralize "
"scattered institutional research assets.\n"
"2. Safeguard institutional scholarly output against data loss through robust digital "
"preservation architectures.\n"
"3. Enable large-scale processing of discovery logs and metadata to reveal actionable patterns "
"for university administrators and library leadership.\n"
"4. Undertake analytics to review trends and produce data-guided reports for decision-making and "
"impact assessment.\n\n"
"Research Questions\n"
"1. How does the deployment of an automated repository archival system (URAAS) improve the "
"speed and comprehensiveness of digital preservation compared to traditional manual workflows?\n"
"2. In what ways can automated metadata extraction and multi-linear containers reduce data "
"fragmentation and enhance the visibility of Nigerian Indigenous knowledge and cultural "
"scholarly output?\n"
"3. Can curation and archival facilitate preservation of our Indigenous knowledge and cultural "
"scholarly output for posterity?\n"
"4. How can issues of cultural sensitivity, intellectual property, and data sovereignty be "
"incorporated into digital preservation systems?"
)
add_numbered_section(9, "Objectives of the Study [Maximum of 300 words]", objectives)

lit_review = (
"The transformation of academic libraries relies heavily on integrating advanced analytical "
"tools with professional judgment (Davenport & Harris, 2007). Modern approaches leverage "
"predictive analytics and scenario simulation to foster proactive strategy and rapid iteration, "
"replacing reactive planning (Davenport & Harris, 2007; Witten et al., 2011). Automated systems "
"now utilize natural language processing for metadata enrichment, significantly improving "
"digital discovery (Bird et al., 2009; Grishman, 1997). Furthermore, clustering user needs and "
"subject trends allows institutions to deliver highly targeted academic services, moving away "
"from reactive storage to active research intelligence (Borgman, 2015; Smith, 2012).\n\n"
"Automated metadata extraction, particularly through natural language processing (NLP) and "
"machine learning, has been identified as a critical tool for reducing data fragmentation and "
"improving the discoverability of Indigenous knowledge systems. In contexts such as Nigeria, "
"where cultural and scholarly outputs are often dispersed across oral traditions, local "
"repositories, and under-digitized archives, automated systems can standardize descriptive "
"metadata, enrich indexing, and enable interoperability across platforms. When combined with "
"multi-linear container models β€” digital frameworks that allow layered, non-sequential "
"organization of text, audio, and visual materials β€” these technologies can better "
"represent the complexity and contextual richness of Indigenous knowledge. Such approaches not "
"only improve access but also ensure that diverse epistemologies are preserved in forms that "
"reflect their original structure and meaning, rather than being constrained by linear Western "
"archival standards (Davenport & Harris, 2007; Witten et al., 2011).\n\n"
"Curation and archival practices play an equally vital role in safeguarding Indigenous Nigerian "
"knowledge for future generations. Strategic digital curation β€” encompassing selection, "
"contextualization, and preservation β€” ensures that cultural materials remain accessible, "
"authentic, and usable over time. Archival frameworks that incorporate community participation "
"and culturally responsive methodologies are especially important, as they help maintain the "
"integrity and ownership of Indigenous knowledge. Furthermore, sustainable digital preservation "
"techniques, including the use of open standards and long-term storage infrastructures, enhance "
"resilience against data loss and technological obsolescence. Together, these practices "
"transform archives from passive repositories into active agents of cultural continuity and "
"scholarly engagement (Bird et al., 2009; Grishman, 1997; Smith, 2012).\n\n"
"Theoretical Framework\n\n"
"This research is anchored in the Data-Driven Decision Making (DDDM) Framework and the concept "
"of Intelligence-Driven Leadership. The framework posits that shifting from fragmented, "
"anecdotal data collection to centralized, evidence-based systems will directly improve "
"organizational strategic outputs, policy formulation, and global institutional rankings.\n\n"
"The Knowledge Management Theory provides a framework for capturing, storing, and sharing "
"knowledge effectively (Nonaka & Takeuchi, 1995). It emphasizes the transformation of tacit "
"knowledge into explicit forms, which is particularly relevant for indigenous knowledge "
"systems.\n\n"
"The Digital Heritage Theory focuses on the preservation of cultural artifacts using digital "
"technologies, emphasizing authenticity, accessibility, and sustainability (UNESCO, 2017)."
)
add_numbered_section(10, "Literature Review [Maximum of 1000 words]", lit_review)

methodology = (
"Framework Development: Conceptual and Technical Architecture\n\n"
"To establish a modular, microservices-based architecture consisting of: (i) a Django REST "
"Framework backend for repository management and API exposure; (ii) an Elasticsearch 8.x "
"cluster for full-text indexing and discovery; (iii) a React.js progressive web application "
"frontend supporting multilingual and low-bandwidth access; (iv) a Celery-based task queue for "
"asynchronous crawling and processing jobs; and (v) a PostgreSQL relational database for "
"metadata persistence.\n\n"
"Identification, Classification and Coding of Indigenous Knowledge, Cultural Heritage and "
"Innovations\n\n"
"Mapping and classification of assets on UNILAG faculty outputs related to IK, cultural "
"studies, oral traditions and related disciplines; coding with the MARC 21 and Dublin Core "
"metadata standards, extended with IK-specific fields including oral-source attribution, "
"cultural context descriptor, community ownership flag and preservation urgency rating. This "
"phase will produce the URAAS Taxonomy and Metadata Standard (UTMS) document.\n\n"
"Crawling and Curating: System Deployment and Content Ingestion\n\n"
"The URAAS crawler engine will be implemented in Python 3.11 using Scrapy 2.x for structured "
"web extraction and Playwright for JavaScript-rendered pages. It will be configured with "
"faculty-specific crawl rules targeting internal UNILAG web environments, departmental "
"repositories, faculty profile pages and linked external academic profiles (Google Scholar, "
"ResearchGate, ORCID, Academia.edu). Residential proxy rotation (via enterprise proxy services) "
"will be employed to ensure reliable, rate-compliant access to external sources.\n\n"
"Upon ingestion, all content passes through an automated NLP enrichment pipeline, Dublin Core "
"metadata generation, and duplicate detection via MinHash locality-sensitive hashing. This "
"phase will deliver a populated URAAS repository containing a minimum of 5,000 indexed records "
"within the project timeline.\n\n"
"Validation: Integrity, Authenticity and Cultural Compliance Auditing\n\n"
"Validation operates at two levels: technical and cultural. At the technical level, automated "
"audit scripts will verify: (i) file integrity via SHA-256 checksums comparing ingested content "
"against source; (ii) metadata completeness scoring, flagging records below a minimum "
"completeness threshold of 85%; (iii) format conformance checks against PRONOM file format "
"registry standards; and (iv) security scanning for malicious content and personal data "
"exposure using ClamAV and custom PII-detection models.\n\n"
"Preservation: Long-Term Digital Archiving Architecture\n\n"
"Preservation copies of all archived materials will be maintained in three geographically "
"distributed storage locations: primary on-site NVMe storage at UNILAG; a secondary cloud "
"backup on AWS S3-compatible object storage in an African data centre; and a tertiary backup "
"using BagIt-formatted archival packages deposited to a national repository partner.\n\n"
"Analytics for Impact: Evidence-Based Insights and Reporting\n\n"
"A custom analytics dashboard, built with Apache Superset on top of the Elasticsearch and "
"PostgreSQL data stores, will provide real-time and historical visualisations of: (i) "
"repository growth trends by knowledge category, format and faculty; (ii) discovery and access "
"patterns, including most-searched subjects, download frequency and user geographic "
"distribution; (iii) research gap analysis, identifying IK domains and cultural heritage "
"categories under-represented in the institutional scholarly record; (iv) citation and impact "
"tracking for archived scholarly outputs; and (v) community contribution metrics, tracking "
"self-archiving activity and community engagement levels."
)
add_numbered_section(11, "Methodology (should include description of the study area, Data collection and data analysis) [Maximum of 1000 words]", methodology)

expected_results = (
"The expected outcomes of this study are directly mapped to the six specific objectives and the "
"six methodology phases:\n\n"
"Outcome 1: A validated URAAS Indigenous Knowledge Taxonomy (IKT) and Metadata Standard (UTMS) "
"β€” a reusable, openly published classification framework covering at least six primary IK "
"categories, applicable to other Nigerian universities and institutional repositories.\n\n"
"Outcome 2: A fully functional, deployable URAAS platform as a modular, culturally sensitive "
"digital asset management system with self-archiving portal, role-based access controls, "
"multilingual interface and a documented API, deployable by any Nigerian university repository "
"administrator.\n\n"
"Outcome 3: A populated institutional repository containing a minimum of 5,000 indexed records "
"that include faculty scholarly outputs, community-sourced indigenous knowledge assets (audio, "
"video, text and image), enriched with NLP-generated metadata in compliance with the UTMS.\n\n"
"Outcome 4: A Validation and Audit Report certifying the integrity, cultural compliance and IP "
"sovereignty of archived content, accompanied by a replicable Community Validation Protocol and "
"Cultural Arbitration Workflow transferable to future archival projects.\n\n"
"Outcome 5: A long-term URAAS Digital Preservation Policy and a three-site preservation "
"infrastructure to demonstrate format migration workflows, integrity audit cycles and a signed "
"MoU securing post-grant institutional maintenance, ensuring the survival of archived assets "
"for a minimum of 25 years.\n\n"
"Outcome 6: Quarterly Data-Guided Reports and a final Impact Assessment Report delivering "
"evidence-based insights on indigenous knowledge gaps, research trends and institutional "
"performance indicators which will inform UNILAG's strategic planning, library policy and "
"national cultural heritage investment decisions.\n\n"
"INNOVATION\n\n"
"URAAS represents a substantive paradigm shift in indigenous knowledge preservation. Its "
"innovation is threefold:\n"
"β€’ Indigenous Enterprise-Grade Design for African Institutions: Unlike existing tools such "
"as Mukurtu CMS (designed for Pacific Indigenous communities) or standard DSpace configurations "
"(designed for Western linear archival norms), URAAS is built for multilingual support (Yoruba, "
"Igbo and Hausa), culturally restricted access tiers, and community self-archiving workflows "
"that return knowledge ownership to originating communities.\n"
"β€’ Integrated Crawling-Curation-Analytics Pipeline: A repository combining automated web "
"crawling, NLP metadata enrichment, community self-archiving and advanced analytics in a single "
"deployable platform.\n"
"β€’ Zero-Markup Infrastructural Scaling: URAAS is built on open-source components (Scrapy, "
"Elasticsearch, Django, PostgreSQL, Apache Superset), eliminating commercial licensing costs so "
"that a Nigerian university with basic cloud infrastructure can adopt and sustain URAAS without "
"ongoing vendor dependency β€” a critical sustainability advantage over commercial DAMS "
"solutions."
)
add_numbered_section(12, "Expected Results [Maximum of 400 words]", expected_results)

# ---------- 13. Work Plan / Timeline (GANTT) ----------
p = doc.add_paragraph()
run = p.add_run("13. Work Plan/ Timeline (Provide activity in the form of a GANTT Chart) [Maximum of 400 words]")
run.bold = True
run.font.size = Pt(12)

gantt_intro = doc.add_paragraph(
    "The 9-month project is organized into seven overlapping work packages aligned to the six "
    "methodology phases plus dissemination. Shaded cells indicate the active month(s) for each "
    "activity."
)

activities = [
    "1. Framework Development (Architecture design, environment setup)",
    "2. Identification, Classification & Coding of IK (UTMS Taxonomy)",
    "3. Crawler Development & Configuration (Scrapy/Playwright)",
    "4. Crawling & Curating: Content Ingestion (target: 5,000 records)",
    "5. NLP Metadata Enrichment & Duplicate Detection",
    "6. Validation: Technical & Cultural Compliance Auditing",
    "7. Preservation: Three-Site Archival Infrastructure Setup",
    "8. Analytics Dashboard Development (Apache Superset)",
    "9. Community Engagement & Local Advocacy (Faculty mapping/travels)",
    "10. Quarterly Data-Guided Reports",
    "11. Dissemination (Publications, Final Impact Assessment Report)",
]
# months active per activity (1-indexed, 9 months)
schedule = {
    0: [1, 2],
    1: [1, 2, 3],
    2: [2, 3],
    3: [3, 4, 5, 6],
    4: [4, 5, 6],
    5: [5, 6, 7],
    6: [6, 7, 8],
    7: [6, 7, 8, 9],
    8: [2, 5, 8],
    9: [3, 6, 9],
    10: [8, 9],
}

n_months = 9
gt = doc.add_table(rows=len(activities) + 1, cols=1 + n_months)
gt.style = 'Table Grid'
gt.alignment = WD_TABLE_ALIGNMENT.CENTER

hdr = gt.rows[0].cells
hdr[0].text = "Activity"
for m in range(1, n_months + 1):
    hdr[m].text = f"M{m}"
for c in hdr:
    shade_cell(c, "D9E2F3")
    for r in c.paragraphs[0].runs:
        r.bold = True

for i, act in enumerate(activities):
    row = gt.rows[i + 1].cells
    row[0].text = act
    active_months = schedule[i]
    for m in range(1, n_months + 1):
        cell = row[m]
        if m in active_months:
            cell.text = "X"
            shade_cell(cell, "F4B084")
            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
        else:
            cell.text = ""

# widen activity column
for i, row in enumerate(gt.rows):
    row.cells[0].width = Inches(2.6)
    for m in range(1, n_months + 1):
        row.cells[m].width = Inches(0.45)

doc.add_paragraph("")

# ---------- 14. Budget ----------
p = doc.add_paragraph()
run = p.add_run("14. Budget")
run.bold = True
run.font.size = Pt(12)
doc.add_paragraph("BUDGET TEMPLATE").runs[0].bold = True

budget_rows = [
    ["SN", "ITEM DESCRIPTION", "QUANTITY", "RATE (₦)", "AMOUNT (₦)"],
    ["1", "Personnel Cost", "", "", ""],
    ["a", "Principal Investigator", "1", "182,597.92", "182,597.92"],
    ["b", "Other research members", "4", "106,515.46", "426,061.82"],
    ["", "Total (≀ 12.5% of Total Budget)", "", "", "608,659.74"],
    ["2", "Equipment (Detailed specification)", "", "", ""],
    ["a", "Equipment (<25%) (9-Month Cloud Compute Instances & NVMe Storage)", "", "1,350,500.00", "1,350,500.00"],
    ["", "Total", "", "", "1,350,500.00"],
    ["3", "Consumables and Supplies", "", "", ""],
    ["a", "Supplies and Consumables (Dev environments, administrative supplies)", "2", "250,000.00", "250,000.00"],
    ["b", "Stationaries", "1", "150,000.00", "150,000.00"],
    ["", "Total", "", "", "400,000.00"],
    ["4", "Data Collection and Analysis", "", "", ""],
    ["a", "Data Collection and Analysis (Enterprise Proxies, API Quotas, Elasticsearch)", "", "1,515,600.00", "1,515,600.00"],
    ["", "Total", "", "", "1,515,600.00"],
    ["5", "Travels", "", "", ""],
    ["a", "Local travels (To the selected universities)", "", "", "247,422.26"],
    ["", "Total (≀ 5% of Total Budget)", "", "", "247,422.26"],
    ["6", "Dissemination", "", "", ""],
    ["a", "Publications (local and international)", "", "150,000.00", "250,000.00"],
    ["b", "Travels: Local advocacy/mapping across UNILAG faculties", "2", "300,000.00", "285,000.00"],
    ["", "Total", "", "", "530,000.00"],
    ["7", "Miscellaneous", "", "", ""],
    ["a", "Logistics", "", "237,347.50", "237,347.50"],
    ["", "Total", "", "", "237,347.50"],
    ["", "GRAND TOTAL", "", "", "4,889,529.50"],
]
bt = doc.add_table(rows=len(budget_rows), cols=5)
bt.style = 'Table Grid'
for i, row in enumerate(budget_rows):
    for j, val in enumerate(row):
        cell = bt.rows[i].cells[j]
        cell.text = val
        if i == 0:
            shade_cell(cell, "D9E2F3")
            for r in cell.paragraphs[0].runs:
                r.bold = True
        if "Total" in row[1] or row[1] == "GRAND TOTAL":
            shade_cell(cell, "FCE4D6")
            for r in cell.paragraphs[0].runs:
                r.bold = True

doc.add_paragraph("")

# ---------- 15. References ----------
p = doc.add_paragraph()
run = p.add_run("15. References [Maximum of 25 References, preferably in APA 6 format]")
run.bold = True
run.font.size = Pt(12)

references = [
"Battiste, M. (2002). Indigenous knowledge and pedagogy in First Nations education: A literature review with recommendations. Indian and Northern Affairs Canada.",
"Berkes, F. (2009). Sacred ecology (2nd ed.). Routledge.",
"Bird, S., Klein, E., & Loper, E. (2009). Natural language processing with Python: Analyzing text with the natural language toolkit. O'Reilly Media.",
"Borgman, C. L. (2015). Big data, little data, no data: Scholarship in the networked world. MIT Press.",
"Christen, K. (2012). Does information really want to be free? Indigenous knowledge systems and the question of openness. International Journal of Communication, 6, 2870–2893.",
"Davenport, T. H., & Harris, J. G. (2007). Competing on analytics: The new science of winning. Harvard Business School Press.",
"Gilliland, A. J. (2014). Conceptualizing 21st-century archives. Society of American Archivists.",
"Grishman, R. (1997). Information extraction: Techniques and challenges. In M. T. Pazienza (Ed.), Information extraction: A multidisciplinary approach to an emerging information technology (pp. 10–27). Springer.",
"Jessen, T. D., Ban, N. C., Claxton, N. X., & Darimont, C. T. (2022). Contributions of Indigenous Knowledge to ecological and evolutionary understanding. Frontiers in Ecology and the Environment, 20(2), 93–101.",
"Ngulube, P. (2002). Preservation and access to public records and archives in South Africa [Unpublished doctoral dissertation]. University of Natal.",
"Nonaka, I., & Takeuchi, H. (1995). The knowledge-creating company: How Japanese companies create the dynamics of innovation. Oxford University Press.",
"Smith, L. T. (2012). Decolonizing methodologies: Research and indigenous peoples (2nd ed.). Zed Books.",
"UNESCO. (2017). Local and indigenous knowledge systems (LINKS) programme. United Nations Educational, Scientific and Cultural Organization.",
"Whyte, K. (2017). Indigenous climate change studies: Indigenizing futures, decolonizing the Anthropocene. English Language Notes, 55(1–2), 153–162.",
"Witten, I. H., Frank, E., & Hall, M. A. (2011). Data mining: Practical machine learning tools and techniques (3rd ed.). Morgan Kaufmann.",
]
for i, ref in enumerate(references, start=1):
    ref_p = doc.add_paragraph(ref)
    ref_p.paragraph_format.left_indent = Inches(0.5)
    ref_p.paragraph_format.first_line_indent = Inches(-0.5)

doc.add_paragraph("")
note = doc.add_paragraph()
note_run = note.add_run(
    "Note: References correspond to in-text citations used throughout this proposal. Please "
    "verify publisher details/page numbers against your source copies before final submission."
)
note_run.italic = True
note_run.font.size = Pt(9)

doc.add_paragraph("")
doc.add_paragraph("")

sig_table = doc.add_table(rows=2, cols=2)
sig_table.autofit = True
labels = [
    ["_______________________________", "_______________________________"],
    ["Signature of Principal Researcher", "Signature of Director, RMO"],
]
for i, row in enumerate(labels):
    for j, val in enumerate(row):
        sig_table.rows[i].cells[j].text = val

doc.add_paragraph("")
sig_table2 = doc.add_table(rows=2, cols=2)
labels2 = [
    ["_______________________________", "_______________________________"],
    ["Signature of Head of Department of PR", "Signature of Vice-Chancellor"],
]
for i, row in enumerate(labels2):
    for j, val in enumerate(row):
        sig_table2.rows[i].cells[j].text = val

doc.save(OUT_PATH)
print("Saved:", OUT_PATH)