Find a file
Lars Eggert 323d890252
fix: Search for docalias, not document (#3635)
Fixes #3605.

Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
2022-03-14 11:49:23 -05:00
.devcontainer chore: fix node_modules volume for docker dev 2022-03-10 13:03:45 -05:00
.github/workflows ci: fix npm dependencies + use build script 2022-03-09 13:19:06 -05:00
.vscode feat: cypress JS testing for agenda meetings + weekview swimlane (WIP) 2021-11-18 23:48:23 +00:00
bin Merge 7.45.1.dev0 into Bootstrap 5 update branch. Made a first pass at reconciling differences. 2022-02-17 20:09:49 +00:00
buildbot Removed Henrik from several places that would send him mail at his request. 2021-03-04 18:44:09 +00:00
cypress misc: add .gitignore + fix cypress files to match JS style guide 2021-12-07 03:42:44 +00:00
data Updated docker-related files based on 6.17.0 2016-03-22 21:10:33 +00:00
dev ci: call "parcel build" to package static assets 2022-03-09 15:45:32 -04:00
docker chore: fix node_modules volume for docker dev 2022-03-10 13:03:45 -05:00
etc Removed the crontab, because of too many drawbacks. 2016-06-17 13:07:52 +00:00
ietf fix: Search for docalias, not document (#3635) 2022-03-14 11:49:23 -05:00
media chore: remove deprecated files + add excluded patterns for deploy (#3589) 2022-03-08 08:20:52 -06:00
notes Move items from PLAN into Trac or to the notes directory. Commit ready for merge. 2021-07-09 16:36:05 +00:00
patch Remove oic patch - 1.3.0 contains the fix. Commit ready for merge. 2021-07-14 18:31:45 +00:00
pyzmail Pyflakes fixes to our copy of pyzmail 2019-07-22 18:27:49 +00:00
svn-history chore: capture svn changeset to git commit mapping (#3573) 2022-03-07 13:00:06 -06:00
test Add some ignores 2021-11-09 11:57:49 +00:00
vzic Changed the plain UTC.ics zoneinfo entry from symlink to file. 2020-09-16 18:16:28 +00:00
.editorconfig chore: add bootstrap 3 copy on npm postinstall (#3587) 2022-03-07 19:13:51 -05:00
.eslintrc.js Switch to list.js 2021-11-22 09:21:32 +00:00
.gitignore Merge remote-tracking branch 'origin/main' into personal/jennifer/7.45.1.dev0.bootstrap-merge 2022-03-08 14:03:49 -04:00
.npmrc chore: add bootstrap 3 copy on npm postinstall (#3587) 2022-03-07 19:13:51 -05:00
.pylintrc Added a pylint rc-file, and fixed or silenced a number of issues found by pylint using the settings .pylintrc (which enable only error checking). 2016-09-08 14:48:59 +00:00
changelog Changelog entry for 7.46.0 2022-02-24 03:05:33 +00:00
changelog.py Python2/3 compatibility: replaced six.ensure_text() with either six.text_type or django's force_text(), depending on the case, and fixed a variable scope issue. 2019-07-16 13:20:05 +00:00
cypress.json feat: cypress JS testing for agenda meetings + weekview swimlane (WIP) 2021-11-18 23:48:23 +00:00
debug.py Added a couple of functions to debug.py 2020-06-06 20:12:00 +00:00
hold-for-merge adjust merge queue 2022-02-22 22:58:03 +00:00
LICENSE.md Update some documentation (and convert to Markdown.) 2021-11-24 15:05:26 +00:00
mypy.ini Added a mypy .ini file 2019-09-30 15:38:22 +00:00
package-lock.json chore: fix docker dev boot for parcel build 2022-03-09 18:04:18 -05:00
package.json Merge remote-tracking branch 'origin/main' into feat/bs5 2022-03-09 15:19:04 -04:00
README.md Merge remote-tracking branch 'origin/main' into feat/bs5 2022-03-09 15:19:04 -04:00
ready-for-merge adjust mergequeue 2021-12-01 22:58:44 +00:00
release-coverage.json.gz Code coverage data for release 7.46.0 2022-02-24 03:05:16 +00:00
requirements.txt Merge 7.45.1.dev0 into Bootstrap 5 update branch. Made a first pass at reconciling differences. 2022-02-17 20:09:49 +00:00
tzparse.py Initial 2to3 patch with added copyright statement updates. 2019-06-27 14:40:54 +00:00

IETF Datatracker

Release License Nightly Dev DB Image
Python Version Django Version Node Version MariaDB Version

The day-to-day front-end to the IETF database for people who work on IETF standards.

Getting Started

This project is following the standard Git Feature Workflow development model. Learn about all the various steps of the development workflow, from creating a fork to submitting a pull request, in the Contributing guide.

Make sure to read the Styleguides section to ensure a cohesive code format across the project.

You can submit bug reports, enhancement and new feature requests in the discussions area. Accepted tickets will be converted to issues.

Prerequisites

  • Python 3.6
  • Django 2.x
  • Node.js 16.x
  • MariaDB 10

See the Docker Dev Environment section for a preconfigured docker environment.

Git Cloning Tips

Because of the extensive history of this project, cloning the datatracker project locally can take a long time / disk space. You can speed up the cloning process by limiting the history depth, for example:

  • To fetch only up to the 10 latest commits:
    git clone --depth=10 https://github.com/ietf-tools/datatracker.git
    
  • To fetch only up to a specific date:
    git clone --shallow-since=DATE https://github.com/ietf-tools/datatracker.git
    

Code Tree Overview

The ietf/templates/ directory contains Django templates used to generate web pages for the datatracker, mailing list, wgcharter and other things.

Most of the other ietf sub-directories, such as meeting, contain the python/Django model and view information that go with the related templates. In these directories, the key files are:

File Description
urls.py binds a URL to a view, possibly selecting some data from the model.
models.py has the data models for the tool area.
views.py has the views for this tool area, and is where views are bound to the template.

Adding a New Web Page

To add a new page to the tools, first explore the models.py to see if the model you need already exists. Within models.py are classes such as:

class IETFWG(models.Model):
    ACTIVE = 1
    group_acronym = models.ForeignKey(Acronym, primary_key=True, unique=True, editable=False)
    group_type = models.ForeignKey(WGType)
    proposed_date = models.DateField(null=True, blank=True)
    start_date = models.DateField(null=True, blank=True)
    dormant_date = models.DateField(null=True, blank=True)
    ...

In this example, the IETFWG class can be used to reference various fields of the database including group_type. Of note here is that group_acronym is the Acronym model so fields in that model can be accessed (e.g., group_acronym.name).

Next, add a template for the new page in the proper sub-directory of the ietf/templates directory. For a simple page that iterates over one type of object, the key part of the template will look something like this:

{% for wg in object_list %}
<tr>
<td><a href="{{ wg.email_archive }}">{{ wg }}</a></td>
<td>{{ wg.group_acronym.name }}</td>
</tr>
{% endfor %}

In this case, we're expecting object_list to be passed to the template from the view and expecting it to contain objects with the IETFWG model.

Then add a view for the template to views.py. A simple view might look like:

def list_wgwebmail(request):
    wgs = IETFWG.objects.all();
    return render_to_response('mailinglists/wgwebmail_list.html', {'object_list': wgs})

The selects the IETFWG objects from the database and renders the template with them in object_list. The model you're using has to be explicitly imported at the top of views.py in the imports statement.

Finally, add a URL to display the view to urls.py. For this example, the reference to list_wgwebmail view is called:

urlpatterns += patterns('',
     ...
     (r'^wg/$', views.list_wgwebmail),
)

Testing your work

Assuming you have the database settings configured already, you can run the server locally with:

 $ ietf/manage.py runserver localhost:<port>

where <port> is arbitrary. Then connect your web browser to localhost:<port> and provide the URL to see your work.

When you believe you are ready to commit your work, you should run the test suite to make sure that no tests break. You do this by running

 $ ietf/manage.py test --settings=settings_sqlitetest

Docker Dev Environment

In order to simplify and reduce the time required for setup, a preconfigured docker environment is available.

Read the Docker Dev Environment guide to get started.

Continuous Integration

TODO

Database & Assets

Nightly database dumps of the datatracker are available at
https://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz

Note that this link is provided as reference only. To update the database in your dev environment to the latest version, you should instead run the docker/cleandb script!

Additional data files used by the datatracker (e.g. instance drafts, charters, rfcs, agendas, minutes, etc.) are available at
https://www.ietf.org/standards/ids/internet-draft-mirror-sites/

A script is available at docker/scripts/app-rsync-extras.sh to automatically fetch these resources via rsync.


Bootstrap 5 Upgrade

An upgrade of the UI to use Bootstrap 5 is under way. The following notes describe this work-in-progress and should be integrated with the rest of the document as the details and processes become final.

Intro

We now use npm to manage assets for the Datatracker, and parcel to package them. npm maintains its node packages under node_modules.

The Datatracker includes these packages from the various Javascript and CSS files in ietf/static/js and ietf/static/css, respectively. Static images are likewise in ietf/static/images.

Whenever changes are made to the files under ietf/static, you must re-run parcel to package them:

npx parcel build

This will create packages under ietf/static/dist/ietf, which are then served by the Django development server, and which must be uploaded to the CDN.

Use Bootstrap Whenever You Can

The "new" datatracker uses Twitter Bootstrap for the UI.

Get familiar with https://getbootstrap.com/getting-started/ and use those UI elements, CSS classes, etc. instead of cooking up your own.

Some ground rules:

  • Think hard before tweaking the bootstrap CSS, it will make it harder to upgrade to future releases.
  • No <style> tags in the HTML! Put CSS into the "morecss" block of a template instead.
  • CSS that is used by multiple templates goes into static/css/ietf.css or a new CSS file.
  • Javascript that is only used on one template goes into the "js" block of that template.
  • Javascript that is used by multiple templates goes into static/js/ietf.js or a new js file.
  • Every template includes jquery, so write jquery code and not plain Javascript. It's shorter and often faster.
  • Avoid CSS, HTML styling or Javascript in the python code!

Serving Static Files via CDN

Production Mode

If resources served over a CDN and/or with a high max-age don't have different URLs for different versions, then any component upgrade which is accompanied by a change in template functionality will have a long transition time during which the new pages are served with old components, with possible breakage. We want to avoid this.

The intention is that after a release has been checked out, but before it is deployed, the standard django collectstatic management command will be run, resulting in all static files being collected from their working directory location and placed in an appropriate location for serving via CDN. This location will have the datatracker release version as part of its URL, so that after the deployment of a new release, the CDN will be forced to fetch the appropriate static files for that release.

An important part of this is to set up the STATIC_ROOT and STATIC_URL settings appropriately. In 6.4.0, the setting is as follows in production mode:

STATIC_URL = "https://www.ietf.org/lib/dt/%s/"%__version__
STATIC_ROOT = CDN_ROOT + "/a/www/www6s/lib/dt/%s/"%__version__

The result is that all static files collected via the collectstatic command will be placed in a location served via CDN, with the release version being part of the URL.

Development Mode

In development mode, STATIC_URL is set to /static/, and Django's staticfiles infrastructure makes the static files available under that local URL root (unless you set settings.SERVE_CDN_FILES_LOCALLY_IN_DEV_MODE to False). It is not necessary to actually populate the static/ directory by running collectstatic in order for static files to be served when running ietf/manage.py runserver -- the runserver command has extra support for finding and serving static files without running collectstatic.

In order to work backwards from a file served in development mode to the location from which it is served, the mapping is as follows:

Development URL Working copy location
localhost:8000/static/ietf/* ietf/static/ietf/*
localhost:8000/static/secr/* ietf/secr/static/secr/*

Handling of External Javascript and CSS Components

In order to make it easy to keep track of and upgrade external components, these are now handled by a tool called npm via the configuration in package.json.

Handling of Internal Static Files

Previous to this release, internal static files were located under static/, mixed together with the external components. They are now located under ietf/static/ietf/ and ietf/secr/static/secr, and will be collected for serving via CDN by the collectstatic command. Any static files associated with a particular app will be handled the same way (which means that all admin/ static files automatically will be handled correctly, too).

Changes to Template Files

In order to make the template files refer to the correct versioned CDN URL (as given by the STATIC_URL root) all references to static files in the templates have been updated to use the static template tag when referring to static files. This will automatically result in both serving static files from the right place in development mode, and referring to the correct versioned URL in production mode and the simpler /static/ URLs in development mode.

Deployment

During deployment, it is now necessary to run the management command:

ietf/manage.py collectstatic

before activating a new release.