Back

What is the Project scope?

The Project scope today gives you a simple project register β€” a place to record initiatives with a name, owner, start & end dates, current progress (%), and a status that tracks the work from Draft through to Done. Useful for tracking high-level engagements, internal projects, or client-facing milestones without the overhead of a full PM tool.

A complete project management workbench (Tasks, Sub-tasks, Gantt charts, Timesheets, Burndowns, dependency management) is on the roadmap but not yet implemented. For now, projects act as a high-level tracker; detailed task management lives outside the system or in another module.

ℹ️

Honest scope note

The Project scope ships one module: project. It contains a single Project model with status workflow (Draft → Pending → Verified → Done). No Tasks, no Gantt, no Timesheets yet β€” see the Roadmap.

Project lifecycle today

Draft→ Pending→ Verified→ Done

Four-state workflow tracked on the status field. The transition is manual (no auto-rules) β€” set the status as the project moves through approval & execution.

What ships in the project module

CapabilitySourceNotes
Project record (name, dates, owner, progress, status)projectproject.py / Project model
4-state status workflow with trackingprojecttracking=True on status field
Active / archive flagprojectNote: archive blocked via UserError today
Multi-amount fields (decimal_ref to sale)projectamount, amount2, amount3, amount4 β€” for budget/value tracking
Bulk-create helper (action_create_project)projectGenerates 10,000 sample records for stress testing

Prerequisites

  • base module β€” provides Companies and the Auth User model the project's user_id references.
  • At least one user with last_name ilike 'admin' β€” the user_id field domain is filtered to admin-style users today.

Install & first project

Install the project module

Run the install command:

hmx update install project --alias=default --noinput

Open the Project menu

After refresh, navigate to Project → Projects. The list will be empty until you create your first.

Project / Projects
+ Create
NameOwnerStartEndProgressStatus
No projects yet
Empty Project list β€” ready for your first record

Create a project (see next chapter)

See the Projects chapter below for the step-by-step.

Module wiring

  • __hmx__.py declares depends: ["base"]. Loads security/base.model.access.csv + views/projects_views.xml only.
  • Single model: Project in models/project.py. No additional sequences, ACLs, or wizards.
  • Signal hooks (post_save, post_delete) are imported but not yet attached β€” placeholder for future event handling.

What is a Project record?

A Project is a lightweight tracker for a body of work: a name, a date range, an owner (the responsible Auth User), a progress percentage you bump as work advances, and a status. Use it for things like internal initiatives ("ERP rollout phase 2"), client engagements, or compliance projects you want to keep visible without yet having a task system.

How to create a project

Open Projects β†’ click Create

From Project → Projects, click + Create.

Fill in the basics

Enter a Name (max 100 chars, required), pick the Owner (a User), set Start Date and End Date.

New Project
Name
ERP Rollout β€” Phase 2
Owner
Andi Rahman (admin)
Start Date
22 Apr 2026
End Date
31 Aug 2026
Progress
0.0%
Status
Draft
A new project β€” Draft status by default

Save

On save, the project appears in the list. Status defaults to Draft; Active defaults to True.

Update progress as work advances

Edit the project, bump Progress from 0 to 100 as you advance. Change the Status as you transition through the workflow (see next chapter).

ERP Rollout β€” Phase 2 (mid-flight)
Progress
55%
Status
Pending
Progress bar & status updated as work advances

Project rules to know

πŸ”’

Archive is intentionally blocked

Calling action_archive raises a "Testing. Cannot Archive!!" error. To deactivate a project today, set active = False directly via the form (or use the unarchive helper which restores it).

πŸ‘€

Owner field is admin-only

The user_id domain is [('last_name', 'ilike', 'admin')] β€” only users whose last name contains "admin" are pickable. This is a placeholder; expand the domain when proper ownership rules land.

πŸ’°

Four amount fields available

Three Decimal fields (amount, amount2, amount3) and one Float (amount4) are exposed for tracking budget, actual cost, or other monetary values. Decimal fields use the sale.product_price:digits_amount precision reference.

Project model fields

FieldTypeNotes
nameCharField(100)Required
user_idFK → auth.UserCASCADE; domain filtered to admin users
start_date, end_dateDateFieldBoth nullable
progressFloatFieldDefault 0.0
statusCharField (choices)'dr' | 'p' | 'v' | 'do'; tracking=True
activeBooleanFieldDefault True
amount, amount2, amount3DecimalField10 digits, decimal_ref to sale
amount4FloatFieldβ€”

The four states

StateStored asWhen to use
Draft'dr'The project is being scoped β€” name, dates, owner are still being filled in. Default state on create.
Pending'p'Submitted for review or actively in progress, awaiting verification of milestones / deliverables.
Verified'v'Deliverables verified by the project owner / approver. Final sign-off pending.
Done'do'Project is closed β€” no further work expected. Often paired with progress = 100%.

How to change status

Open the project form

Click into the project from the list view.

Edit the Status field

Pick the new state from the dropdown. There are no rules preventing skipping states (e.g., Draft → Done directly), but conventionally you walk through them in order.

ERP Rollout β€” Phase 2
Manual transition β€” no auto-rules today

Save β€” change is tracked

tracking=True on the status field means every change is logged in the chatter (when mail module is installed). You can review the full transition history per project.

Status field implementation

PROJECT_STATUS = [
    ('dr', 'Draft'),
    ('p', 'Pending'),
    ('v', 'Verified'),
    ('do', 'Done'),
]

status = models.CharField(
    _("Status"),
    max_length=50,
    default='dr',
    choices=PROJECT_STATUS,
    tracking=True,
)

No state-machine logic is enforced; transitions are bare assignments. The 2-letter stored values keep the column small. tracking=True persists every change to the chatter when mail is installed.

Capability status

CapabilityTargetStatusWorkaround Today
Project register (name, dates, status, progress)projectShippingβ€”
Status workflow with trackingprojectShippingβ€”
Tasks & sub-tasksproject (planned)PlannedExternal tracker (Jira/Linear) or spreadsheet
Gantt chartproject + webx (planned)PlannedExternal Gantt; Project widgets ship test ManyToMany hooks
Timesheets / Time trackingproject_timesheet (planned)PlannedExternal tool
Milestones & deliverablesproject (planned)PlannedUse the project's progress + status as a single milestone
Task dependencies / critical pathproject (planned)BacklogExternal Gantt with dependency editor
Burndown / velocity reportsproject + olap (planned)BacklogExternal BI
Resource allocation & capacityproject + core_hr (planned)BacklogManual planning sheet
Client-portal task visibilityproject + core_website (planned)BacklogEmail status updates
πŸ“…
For now, treat the Project record as a high-level tracker. Pair it with the chatter (mail module) for activity logs, and use the four-state workflow as your minimal governance.

Module manifest

{
    "name": "Project",
    "category": "project",
    "version": "1.0",
    "depends": ["base"],
    "data": [
        "security/base.model.access.csv",
        "views/projects_views.xml",
    ],
}

Minimal manifest β€” single dependency, single security CSV, single view file. No data seeds, no wizards, no API.

Models

ModelPurposeNotes
ProjectThe single project recordDefault ordering by name; verbose_name "Project"

Notable methods

MethodBehaviour
action_archive()Raises UserError ("Testing. Cannot Archive!!") β€” archive disabled by design
action_unarchive()Sets active = True on selected records
action_create_project()Bulk-generates 10,000 sample projects with random names β€” for stress / load testing
default_companyReturns self.env.company (current active company)

Signal hooks

post_save and post_delete are imported from django.db.models.signals and the @receiver decorator is wired up β€” but no actual receiver functions are attached today. Treat these as placeholders for future event-driven behaviour (notifications, cascade updates).

Source files

PathRole
__hmx__.pyManifest
apps.pyDjango AppConfig
models/project.pyProject model + helpers
views/projects_views.xmlList + form views, menu
security/base.model.access.csvACL for the project model