Skip to content

Commit

Permalink
WEP-0001.md: Add Django Microfarm Proposal
Browse files Browse the repository at this point in the history
This WEP describes the approaches and implementation
of the Django Microfarm GSoC 2021 Project.

Close coala#194
  • Loading branch information
pra17dod committed May 30, 2021
1 parent 93c7cce commit 8ec5271
Showing 1 changed file with 159 additions and 0 deletions.
159 changes: 159 additions & 0 deletions WEP-0001.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
# Django Microfarm

| Metadata | |
| -------- | ---------------------------------------------|
| WEP | 0001 |
| Version | 1.0 |
| Title | Django Microfarm |
| Authors | Prashant Dodiya <mailto:pra17dod@gmail.com> |
| Status | Proposed |
| Type | Process |

## Abstract

This WEP describes the approaches and implementation of the [Django
Microfarm](https://projects.coala.io/#/projects?project=django-microfarm&lang=en)
GSoC 2021 project. The aim of this project is to create a tool that allows
anyone to become a market gardener, given some space. As a first step, a user
will merely sign up and enter the amount of space that (s)he wants to use. The
system will then trigger tasks the user has to do to farm on his space
efficiently. Those tasks are triggered by simple rules and may depend on weather
events, date, and later also other triggers. Thus, anyone can be a market
gardener, and this tool will be beneficial and easy to use.

## Introduction

This project is under the Sub Organization named WeField e.V. It is a German NGO
that takes regenerative and climate actions on monocultural used Wasteland. This
project will promote market gardening among the people. They will be growing
their vegetables, fruits all by themselves. They can even sell their products as
a source of passive income. To understand this project Market Gardening and
No-dig Method are essential to be understood first.

- Market Gardening

Market gardening is both a very old way to farm and a very new and popular one.
The market gardener is someone who has a small area of land. The term small can
be used compared to most large commercial farms, where acres possessed can
be in the tens of thousands. Typically small could mean anywhere from one to
a couple of acres to 50 or over. On this land, the farmer grows whatever he or
she wishes. Instead of growing it for commercial markets, produce is usually
sold at places like farmer’s markets or to small local grocery stores and
restaurants. Sometimes the market gardener maintains a sales site on their land
and sells directly to customers from the farm.

- No-Dig Gardening

No-dig gardening simply means disturbing existing soil as little as possible.
Here is one example. When starting a new garden bed, instead of digging or
tilling the site, the gardener puts layers of cardboard over the existing grass
lawn or weeds with a layer of compost or some other mulch on top and waters
everything. The idea is that the smothered grass or weeds will gradually die off
over weeks and months,and the cardboard decomposes, leaving a bed ready to
plant. When planting in subsequent years, the existing soil is left as-is and a
new layer of compost is added on top to replenish nutrients.

In this project, we are making a tool that can make anyone a market gardener.
Not everyone has very fertile land, and as we are aiming this for everyone, we
are adapting the no-dig method for gardening.


## Proposal

- Project Setup

I planned to use Django Rest Framework for this project because the backend is
meant to be kept separate from the frontend. In the future, anyone working on
the frontend will have ease working with the APIs. For Continuous Integration, I
will prefer Travis CI as it is more reliable and does the job best. For the
database, PostgreSQL will be a great choice. For the deployment, in my opinion,
Heroku will be better as it has good support for Django apps, from my personal
experience. I am comfortable with any if suggested. The user Model will be
created with the following fields: Name, Password, Email, Planting Space.

- Database Handling

The Database is the key element. It will hold rules required for the watering
tasks, mulching, etc. Also, we need custom rules for specific items. Thus, this
can be achieved by making Custom Rule, Mulching Rule and Watering Rule. In
Django Models, there is a concept of Foriegn Key so, the Custom Rule will hold
the id of the Parent Rule and thus, we can access all the rules for an
item. Below is the psuedo code of Database Structure for Watering and Mulching.
```
Class Custom_Rule:
string Rule_Description
number For_Numerical_Value
boolean For_Boolean_Value
string For_String_Value
Class Mulching_Rule:
string Type_Of_Mulching
boolean Is_Bed_New
number Bed_Width
number Path_Width
list Custom_Rule
//Functions for Mulching
Ask_Every_Bed():
return Is_Bed_new
Class Watering_Rule:
string Plants_Name
number TimeRange_To_Water
number WeekRange_To_Water
number TempRange_To_Water
boolean Water_If_Rain_Today
list Custom_Rule
//Functions for Watering
Ask_If_Today_Fall_In_Week_Range():
return Boolean
Ask_Rain_For_Today():
return Boolean
If Not Rain For Today():
return Boolean
```
As the initially data is stored in csv format, we need to run a script to read
the csv and fill the database tables.


- Mulching

We need to give the information of the Compost required for the Mulching to the
user. And also about when to make the beds so that the beds are ready before the
planting season. For that, there will be a python script calculation based on
the rules predefined in the database. E.g., if the bed is new, then Yes. Along
with the compost requirement, we need to return the number of the beds affected
#SectionletterBednumber, e.g., #F1 and the compost required for one bed and the
date and time to prepare beds.

- Weather API and Watering

The Weather API is needed to forecast the rain. If it is going to rain, then
some crops don’t need watering. There are many options available. I came across
one named Open Weather Map API. For more accurate predictions of the weather
API, we will use GPS to get the latitude and longitude of the land because it
could be on the city’s outskirts, so using the city name is not preferable.
Almost all the weather API has the same functionality. If any other specific
requirements occur, we will look for an API that fulfills our requirements.

There will be rules specific to a type of crop predefined in the database for
the watering tasks. After fetching the weather forecast then considering along
with the other rules, we will tell the user whether to water the farm or not.

| Area | Rule 1 | Rule 2 | Rule 3 | Rule 4 | Rule 5 | Trigger |
|----------|------------|------------|-----------|-----------|-----------|-------------|
| Section 1 | 08:00-12:00 | Today is between W10 - W48 | If raining today, then no | If no rain, ask forecast for the next rain | T < 12 ℃ then no and ask next day again | If the forecast predicts no rain tomorrow, yes |
| Section 2 | 18:00-20:00 | Today is between W10 - W48 | If raining today, then yes | If no rain, ask forecast for the next rain | T< 8 ℃ then no and ask the next day again | If the forecast predicts no rain tomorrow, yes |

- Notifications and Admin View

The next step is to send mail notifications for the routine tasks, e.g.,
watering, opening and closing polytunnel, etc. This can be achieved with Django
SMTP Emailbackend. Admin Views and Filters for the specific user can be done by
using Generic Views and registering in the admin file.

0 comments on commit 8ec5271

Please sign in to comment.