Skip to content

Station¤

Introduction¤

The Station is the main component of Paricia. Stations own the measurement data, who can view the existing data and add new sets, and captures a lot of metadata on the geographical location of the station, including longitude, latitude and altitude, but also region, basin, ecosystem or area covered.

It also owns another key parameter used during the data ingestion process: the timezone where the station is located, used to interpret the time of the datasets.

Incorrect timezone

If this parameter is not defined correctly, the time of the data associated to the station would be interpreted wrong. Check the parameter before uploading data, specially the first time.

As pointed out in the permissions page, Stations visibility can take a third option, internal, that only allows registered users to visualize the data of the station. Stations also require change permission in order to be able to upload data associated to that station and then validating it.

UML diagram of the Station app models.
Figure 1: UML diagram of the Station app models.

Basic Components¤

Country ¤

The country where a station or region is in.

Attributes:

Name Type Description
id int

Primary key.

name str

Country name.

Functions¤

__str__() ¤

Return the country name.

Source code in station/models.py
47
48
49
def __str__(self) -> str:
    """Return the country name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the country.

Source code in station/models.py
51
52
53
def get_absolute_url(self) -> str:
    """Return the absolute url of the country."""
    return reverse("station:country_detail", kwargs={"pk": self.pk})

Region ¤

A region within a country.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the region.

country Country

Country where the region is located.

Functions¤

__str__() ¤

Return the region name.

Source code in station/models.py
82
83
84
def __str__(self) -> str:
    """Return the region name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the region.

Source code in station/models.py
86
87
88
def get_absolute_url(self) -> str:
    """Return the absolute url of the region."""
    return reverse("station:region_detail", kwargs={"pk": self.pk})

Ecosystem ¤

The ecosystem associated with a station.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the ecosystem, e.g. rain forest.

Functions¤

__str__() ¤

Return the ecosystem name.

Source code in station/models.py
107
108
109
def __str__(self) -> str:
    """Return the ecosystem name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the ecosystem.

Source code in station/models.py
111
112
113
def get_absolute_url(self) -> str:
    """Return the absolute url of the ecosystem."""
    return reverse("station:ecosystem_detail", kwargs={"pk": self.pk})

Institution ¤

Institutional partner responsible for a station.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the institution.

Functions¤

__str__() ¤

Return the institution name.

Source code in station/models.py
130
131
132
def __str__(self) -> str:
    """Return the institution name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the institution.

Source code in station/models.py
134
135
136
def get_absolute_url(self) -> str:
    """Return the absolute url of the institution."""
    return reverse("station:institution_detail", kwargs={"pk": self.pk})

StationType ¤

Type of the station, indicating what it measures.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the station type, e.g. pluvometric, hydrological.

Functions¤

__str__() ¤

Return the station type name.

Source code in station/models.py
156
157
158
def __str__(self) -> str:
    """Return the station type name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the station type.

Source code in station/models.py
160
161
162
def get_absolute_url(self) -> str:
    """Return the absolute url of the station type."""
    return reverse("station:stationtype_detail", kwargs={"pk": self.pk})

Place ¤

Specific place that a station is situated.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the place, e.g. Huaraz.

image ImageField

Photography/Map of the location.

Functions¤

__str__() ¤

Return the place name.

Source code in station/models.py
187
188
189
def __str__(self) -> str:
    """Return the place name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the place.

Source code in station/models.py
191
192
193
def get_absolute_url(self) -> str:
    """Return the absolute url of the place."""
    return reverse("station:place_detail", kwargs={"pk": self.pk})

Basin ¤

River(s) basin where the station is located e.g. El Carmen.

Attributes:

Name Type Description
id int

Primary key.

name str

Name of the basin, e.g. El Carmen.

image ImageField

Photography/Map of the basin.

file FileField

PDF file with details of the basin.

Functions¤

__str__() ¤

Return the basin name.

Source code in station/models.py
228
229
230
def __str__(self) -> str:
    """Return the basin name."""
    return str(self.name)
get_absolute_url() ¤

Return the absolute url of the basin.

Source code in station/models.py
232
233
234
def get_absolute_url(self) -> str:
    """Return the absolute url of the basin."""
    return reverse("station:basin_detail", kwargs={"pk": self.pk})

PlaceBasin ¤

Associates a Basin with a Place and an image.

Attributes:

Name Type Description
id int

Primary key.

place Place

Place of the association.

basin Basin

Basin of the association.

image ImageField

Photography/Map of the place within the basin.

Functions¤

__str__() ¤

Return the place-basin association.

Source code in station/models.py
273
274
275
def __str__(self) -> str:
    """Return the place-basin association."""
    return str(self.place) + " - " + str(self.basin)
get_absolute_url() ¤

Return the absolute url of the place-basin association.

Source code in station/models.py
277
278
279
def get_absolute_url(self) -> str:
    """Return the absolute url of the place-basin association."""
    return reverse("station:placebasin_detail", kwargs={"pk": self.pk})

Core Components¤

Station ¤

Main representation of a station, including several metadata.

Attributes:

Name Type Description
visibility str

Visibility level of the object, including an "internal" option.

station_id int

Primary key.

station_code str

Unique code for the station.

station_name str

Brief description of the station.

station_type StationType

Type of the station.

country Country

Country where the station is located.

region Region

Region within the Country where the station is located.

ecosystem Ecosystem

Ecosystem associated with the station.

institution Institution

Institutional partner responsible for the station.

place_basin PlaceBasin

Place-Basin association.

station_state bool

Is the station operational?

timezone str

Timezone of the station.

station_latitude Decimal

Latitude of the station, in degrees [-90 to 90].

station_longitude Decimal

Longitude of the station, in degrees [-180 to 180].

station_altitude int

Altitude of the station.

influence_km Decimal

Area of influence in km2.

station_file ImageField

Photography of the station.

station_external bool

Is the station external?

variables str

Comma-separated list of variables measured by the station.

Attributes¤

variables_list property ¤

Return the list of variables measured by the station.

Only variables with data in the database are returned.

Returns:

Type Description
list[str]

list[str]: List of variables measured by the station.

Functions¤

__str__() ¤

Return the station code.

Source code in station/models.py
458
459
460
def __str__(self) -> str:
    """Return the station code."""
    return str(self.station_code)
get_absolute_url() ¤

Return the absolute url of the station.

Source code in station/models.py
462
463
464
def get_absolute_url(self) -> str:
    """Return the absolute url of the station."""
    return reverse("station:station_detail", kwargs={"pk": self.pk})
set_object_permissions() ¤

Set object-level permissions.

This method is called by the save method of the model to set the object-level permissions based on the visibility level of the object. In addition to the standard permissions for the station, the view_measurements permission is set which controls who can view the measurements associated to the station.

Source code in station/models.py
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
def set_object_permissions(self) -> None:
    """Set object-level permissions.

    This method is called by the save method of the model to set the object-level
    permissions based on the visibility level of the object. In addition to the
    standard permissions for the station, the view_measurements permission is set
    which controls who can view the measurements associated to the station.
    """
    super().set_object_permissions()

    standard_group = Group.objects.get(name="Standard")
    anonymous_user = get_anonymous_user()

    # Assign view_measurements permission based on permissions level
    if self.visibility == "public":
        assign_perm("view_measurements", standard_group, self)
        assign_perm("view_measurements", anonymous_user, self)
        if self.owner:
            remove_perm("view_measurements", self.owner, self)
    elif self.visibility == "internal":
        assign_perm("view_measurements", standard_group, self)
        remove_perm("view_measurements", anonymous_user, self)
        if self.owner:
            remove_perm("view_measurements", self.owner, self)
    elif self.visibility == "private":
        remove_perm("view_measurements", standard_group, self)
        remove_perm("view_measurements", anonymous_user, self)
        if self.owner:
            assign_perm("view_measurements", self.owner, self)