Initial commit

This commit is contained in:
2026-01-04 04:08:32 -05:00
commit d7cf433bb0
26 changed files with 3859 additions and 0 deletions

1796
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

12
Cargo.toml Normal file
View File

@@ -0,0 +1,12 @@
[package]
name = "hrtime"
version = "0.1.0"
edition = "2024"
[dependencies]
diesel = { version = "2.2.9", features = ["sqlite", "64-column-tables", "returning_clauses_for_sqlite_3_35"] }
rocket = "0.5.1"
[dependencies.rocket_sync_db_pools]
version = "0.1.0"
features = ["diesel_sqlite_pool"]

14
Makefile Normal file
View File

@@ -0,0 +1,14 @@
.SUFFIXES: .md .html
MD = index.md contact.md about.md 404.md thanks.md
HTML = $(MD:.md=.html)
COPY = form.html style.css script.js logo.webp hamburger.svg
all: static $(MD)
copy $(COPY) static
static:
mkdir -p static
.md.html:
./md.py gen/$< >static/$@

2
Rocket.toml Normal file
View File

@@ -0,0 +1,2 @@
[global.databases]
db = { url = "db/db.sql" }

10
build.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/bin/sh
mkdir -p static
cd gen
cp form.html style.css script.js logo.webp hamburger.svg ../static
for md in index.md about.md future.md contact.md thanks.md 404.md ; do
../md.py $md >../static/${md%.*}.html
done

8
db/01-primary/down.sql Normal file
View File

@@ -0,0 +1,8 @@
DROP TABLE gender;
DROP TABLE ethnicity;
DROP TABLE medication;
DROP TABLE masculine;
DROP TABLE masculine_sex;
DROP TABLE feminine;
DROP TABLE feminine_sex;
DROP TABLE entry;

234
db/01-primary/up.sql Normal file
View File

@@ -0,0 +1,234 @@
-- hrtime - transgender survey website
-- Copyright (C) 2025 Olive <hello@grasswren.net>
-- see LICENCE file for licensing information
CREATE TABLE IF NOT EXISTS entry (
id INTEGER PRIMARY KEY,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
birthdate DATETIME NOT NULL,
country TEXT NOT NULL,
medication TEXT NOT NULL,
conditions TEXT NOT NULL,
other TEXT NOT NULL,
blood_test BOOLEAN NOT NULL,
feedback TEXT NOT NULL,
heard TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS gender (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
male BOOLEAN NOT NULL,
female BOOLEAN NOT NULL,
nonbinary BOOLEAN NOT NULL,
agender BOOLEAN NOT NULL,
genderfluid BOOLEAN NOT NULL,
genderqueer BOOLEAN NOT NULL,
demigender BOOLEAN NOT NULL,
questioning BOOLEAN NOT NULL,
other BOOLEAN NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS ethnicity (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
african_american BOOLEAN NOT NULL,
east_asian BOOLEAN NOT NULL,
south_asian BOOLEAN NOT NULL,
southeast_asian BOOLEAN NOT NULL,
hispanic BOOLEAN NOT NULL,
middle_eastern_north_african BOOLEAN NOT NULL,
subsaharan_african BOOLEAN NOT NULL,
white BOOLEAN NOT NULL,
native_american BOOLEAN NOT NULL,
pacific_islander BOOLEAN NOT NULL,
other BOOLEAN NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS medication (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
med TEXT NOT NULL,
method TEXT NOT NULL,
amount TEXT NOT NULL,
frequency TEXT NOT NULL,
start DATETIME NOT NULL,
end DATETIME NOT NULL,
ongoing BOOLEAN NOT NULL,
stop_reason TEXT NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS masculine (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
-- skin
thicker_skin BOOLEAN NOT NULL,
acne_oily_skin BOOLEAN NOT NULL,
stronger_nails BOOLEAN NOT NULL,
increased_perspiration BOOLEAN NOT NULL,
decreased_perspiration BOOLEAN NOT NULL,
body_odour BOOLEAN NOT NULL,
-- hair
facial_body_hair_growth BOOLEAN NOT NULL,
male_pattern_baldness BOOLEAN NOT NULL,
-- body shape
weight_gain BOOLEAN NOT NULL,
pelvic_bone_structure BOOLEAN NOT NULL,
fat_redistribution BOOLEAN NOT NULL,
increased_muscle_mass BOOLEAN NOT NULL,
face BOOLEAN NOT NULL,
-- emotions
increased_irritability BOOLEAN NOT NULL,
sex_orientation BOOLEAN NOT NULL,
-- sensation
improved_smell BOOLEAN NOT NULL,
worsened_smell BOOLEAN NOT NULL,
dulled_taste_smell BOOLEAN NOT NULL,
-- miscellaneous
deeper_voice BOOLEAN NOT NULL,
cessation_of_menstruation BOOLEAN NOT NULL,
sleep_apnea BOOLEAN NOT NULL,
rise_in_cholesterol BOOLEAN NOT NULL,
high_blood_pressure BOOLEAN NOT NULL,
polycythemia BOOLEAN NOT NULL,
cramps BOOLEAN NOT NULL,
increased_appetite BOOLEAN NOT NULL,
decreased_appetite BOOLEAN NOT NULL,
increased_drug_tolerance BOOLEAN NOT NULL,
decreased_drug_tolerance BOOLEAN NOT NULL,
improved_sleep BOOLEAN NOT NULL,
worsened_sleep BOOLEAN NOT NULL,
feeling_warmer BOOLEAN NOT NULL,
feeling_colder BOOLEAN NOT NULL,
other TEXT NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS masculine_sex (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
genital_moisture_odour BOOLEAN NOT NULL,
clitoral_growth BOOLEAN NOT NULL,
vaginal_atrophy BOOLEAN NOT NULL,
vaginal_dryness BOOLEAN NOT NULL,
vaginal_discharge BOOLEAN NOT NULL,
genital_sensitivity BOOLEAN NOT NULL,
orgasm BOOLEAN NOT NULL,
increased_libido BOOLEAN NOT NULL,
decreased_libido BOOLEAN NOT NULL,
other TEXT NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS feminine (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
-- skin
softer_skin BOOLEAN NOT NULL,
less_oily_skin BOOLEAN NOT NULL,
thinner_softer_fingernails BOOLEAN NOT NULL,
increased_perspiration BOOLEAN NOT NULL,
decreased_perspiration BOOLEAN NOT NULL,
body_odour BOOLEAN NOT NULL,
-- hair
reduced_body_hair BOOLEAN NOT NULL,
hairline BOOLEAN NOT NULL,
-- body shape
slimmer_hands_wrists BOOLEAN NOT NULL,
smaller_feet BOOLEAN NOT NULL,
breast_growth BOOLEAN NOT NULL,
fat_redistribution BOOLEAN NOT NULL,
reduced_muscle_mass BOOLEAN NOT NULL,
face BOOLEAN NOT NULL,
-- emotions
increased_emotionality_sensitivity BOOLEAN NOT NULL,
sex_orientation BOOLEAN NOT NULL,
-- sensation
improved_smell BOOLEAN NOT NULL,
worsened_smell BOOLEAN NOT NULL,
taste BOOLEAN NOT NULL,
-- miscellaneous
increased_flexibility BOOLEAN NOT NULL,
increased_appetite BOOLEAN NOT NULL,
decreased_appetite BOOLEAN NOT NULL,
increased_drug_tolerance BOOLEAN NOT NULL,
decreased_drug_tolerance BOOLEAN NOT NULL,
feeling_warmer BOOLEAN NOT NULL,
feeling_colder BOOLEAN NOT NULL,
improved_sleep BOOLEAN NOT NULL,
worsened_sleep BOOLEAN NOT NULL,
other TEXT NOT NULL,
-- cyclical
cramping BOOLEAN NOT NULL,
bloating BOOLEAN NOT NULL,
gas BOOLEAN NOT NULL,
unstable_emotions BOOLEAN NOT NULL,
pains BOOLEAN NOT NULL,
breast_tenderness BOOLEAN NOT NULL,
acne BOOLEAN NOT NULL,
fatigue BOOLEAN NOT NULL,
appetite_cravings BOOLEAN NOT NULL,
migranes BOOLEAN NOT NULL,
cycle TEXT NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);
CREATE TABLE IF NOT EXISTS feminine_sex (
id INTEGER PRIMARY KEY,
entry INTEGER NOT NULL,
genital_moisture_odour BOOLEAN NOT NULL,
genital_color_texture BOOLEAN NOT NULL,
fewer_erections BOOLEAN NOT NULL,
clear_ejaculate BOOLEAN NOT NULL,
testicular_atrophy BOOLEAN NOT NULL,
increased_genital_sensitivity BOOLEAN NOT NULL,
genital_response BOOLEAN NOT NULL,
orgasm BOOLEAN NOT NULL,
increased_libido BOOLEAN NOT NULL,
decreased_libido BOOLEAN NOT NULL,
other TEXT NOT NULL,
FOREIGN KEY(entry) REFERENCES entry(id)
);

9
diesel.toml Normal file
View File

@@ -0,0 +1,9 @@
# For documentation on how to configure this file,
# see https://diesel.rs/guides/configuring-diesel-cli
[print_schema]
file = "src/schema.rs"
custom_type_derives = ["diesel::query_builder::QueryId", "Clone"]
[migrations_directory]
dir = "db"

2
gen/404.md Normal file
View File

@@ -0,0 +1,2 @@
404 Not Found
The content specified by the address sent could not be found on this server. If you manually entered the link, please check your spelling and try again.

2
gen/about.md Normal file
View File

@@ -0,0 +1,2 @@
About Us
Hi! My name is Lucas (he/they). I founded HRTimelines with my collaborator back in December, 2022. As two trans engineering students, we saw a gap in trans healthcare information and decided to make a difference in a field we know from experience. We are not doctors, but we are motivated to help other trans people hoping to start HRT and medical professionals looking to work with trans patients. Since we started, our team has grown with other trans researchers and students assisting in our website development and data analysis.

6
gen/contact.md Normal file
View File

@@ -0,0 +1,6 @@
Contact Us
If you have any questions, feedback, or just want to chat, please reach out! Feel free to use the form below, email us, or reach out on Instagram.
- [Instagram](https://instagram.com/hrtimelines?igshid=MzMyNGUyNmU2YQ%3D%3D&utm_source=qr)
- [Email](mailto:hrtimelines@gmail.com)
- [Feedback Form](https://forms.gle/eZRGF7BgagHJ668H7)
- [Join Our Mailing List](https://forms.gle/dgiUmjaUQG8mNyJP7)

4
gen/foot.html Normal file
View File

@@ -0,0 +1,4 @@
</section>
</main>
</body>
</html>

736
gen/form.html Normal file
View File

@@ -0,0 +1,736 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width'>
<meta name='description' content='Trans Healthcare Survey Research Website'>
<link rel='stylesheet' href='style.css'>
<script src="https://code.jquery.com/jquery-3.7.1.slim.min.js" integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=" crossorigin="anonymous"></script>
<script src='script.js'></script>
<link rel='icon' href='logo.webp'>
<title>HRTimelines — Form</title>
</head>
<body>
<script>0</script>
<main>
<header>
<div>
<a href='https://hrtimelines.com'><img src='logo.webp' alt='logo' width='50rem' height='50rem'></a>
<h1><a href='https://hrtimelines.com'>HRTimelines</a></h1>
</div>
<div id='nav'>
<img id='hamburger' src='hamburger.svg' alt='nav' width='30rem' height='30rem'>
<nav>
<a href='https://hrtimelines.com'>Home</a>
<a href='https://hrtimelines.com/about'>About</a>
<a href='https://hrtimelines.com/future'>Future Plans</a>
<a href='https://hrtimelines.com/contact'>Contact</a>
<a href='https://hrtimelines.com/form'>Form</a>
</nav>
</div>
</header>
<section>
<p>The following survey inquires about the type and physical effects of the HRT you use. Responses will be used to draw conclusions about the physical effects of HRT and to possibly correlate the timeline of effects with age, ethnicity, types of medications, medication dosage, the use of other medications, or medical conditions.</p>
<p>Data is encrypted and stored in the eastern United States. We do not collect identifying information (such as name or email). Data is retained for future HRTimelines projects, but will not be shared outside of the research team or for any other research or commercial purposes.</p>
<p>The survey takes around ten minutes to complete, and you must be eighteen years of age to participate in our research. For some questions, exact dates are helpful, but a best guess is acceptable. The form will not save your responses over different sessions; it is recommended that you fill the form in one sitting.</p>
</section>
<form action='/form' method='post' enctype='multipart/form-data'>
<section>
<h1>Consent</h1><p></p>
<input type='checkbox' id='consent-age' class='con' required>
<label for='consent-age'>I am eighteen years of age and currently taking hormone replacement therapy (HRT).</label>
<br>
<input type='checkbox' id='consent-data' class='con' required>
<label for='consent-data'>I have read the above information. I agree to participate in this survey and agree to have my data retained for research purposes as described above.</label>
</section>
<section class='all'>
<h1>Demographics</h1><p></p>
<label for='dob'>What is your date of birth?</label>
<input type='date' id='dob' name='entry.birthdate'>
<br>
<label for='country'>What is your primary country of residence?</label>
<select id='country' name='entry.country'>
<option value=""></option>
<option value="Afghanistan">Afghanistan</option>
<option value="Åland Islands">Åland Islands</option>
<option value="Albania">Albania</option>
<option value="Algeria">Algeria</option>
<option value="American Samoa">American Samoa</option>
<option value="Andorra">Andorra</option>
<option value="Angola">Angola</option>
<option value="Anguilla">Anguilla</option>
<option value="Antarctica">Antarctica</option>
<option value="Antigua and Barbuda">Antigua and Barbuda</option>
<option value="Argentina">Argentina</option>
<option value="Armenia">Armenia</option>
<option value="Aruba">Aruba</option>
<option value="Australia">Australia</option>
<option value="Austria">Austria</option>
<option value="Azerbaijan">Azerbaijan</option>
<option value="Bahamas">Bahamas</option>
<option value="Bahrain">Bahrain</option>
<option value="Bangladesh">Bangladesh</option>
<option value="Barbados">Barbados</option>
<option value="Belarus">Belarus</option>
<option value="Belgium">Belgium</option>
<option value="Belize">Belize</option>
<option value="Benin">Benin</option>
<option value="Bermuda">Bermuda</option>
<option value="Bhutan">Bhutan</option>
<option value="Bolivia (Plurinational State of)">Bolivia (Plurinational State of)</option>
<option value="Bonaire, Sint Eustatius and Saba">Bonaire, Sint Eustatius and Saba</option>
<option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option>
<option value="Botswana">Botswana</option>
<option value="Bouvet Island">Bouvet Island</option>
<option value="Brazil">Brazil</option>
<option value="British Indian Ocean Territory">British Indian Ocean Territory</option>
<option value="Brunei Darussalam">Brunei Darussalam</option>
<option value="Bulgaria">Bulgaria</option>
<option value="Burkina Faso">Burkina Faso</option>
<option value="Burundi">Burundi</option>
<option value="Cabo Verde">Cabo Verde</option>
<option value="Cambodia">Cambodia</option>
<option value="Cameroon">Cameroon</option>
<option value="Canada">Canada</option>
<option value="Cayman Islands">Cayman Islands</option>
<option value="Central African Republic">Central African Republic</option>
<option value="Chad">Chad</option>
<option value="Chile">Chile</option>
<option value="China">China</option>
<option value="Christmas Island">Christmas Island</option>
<option value="Cocos (Keeling) Islands">Cocos (Keeling) Islands</option>
<option value="Colombia">Colombia</option>
<option value="Comoros">Comoros</option>
<option value="Congo">Congo</option>
<option value="Congo (Democratic Republic of the)">Congo (Democratic Republic of the)</option>
<option value="Cook Islands">Cook Islands</option>
<option value="Costa Rica">Costa Rica</option>
<option value="Côte d'Ivoire">Côte d'Ivoire</option>
<option value="Croatia">Croatia</option>
<option value="Cuba">Cuba</option>
<option value="Curaçao">Curaçao</option>
<option value="Cyprus">Cyprus</option>
<option value="Czech Republic">Czech Republic</option>
<option value="Denmark">Denmark</option>
<option value="Djibouti">Djibouti</option>
<option value="Dominica">Dominica</option>
<option value="Dominican Republic">Dominican Republic</option>
<option value="Ecuador">Ecuador</option>
<option value="Egypt">Egypt</option>
<option value="El Salvador">El Salvador</option>
<option value="Equatorial Guinea">Equatorial Guinea</option>
<option value="Eritrea">Eritrea</option>
<option value="Estonia">Estonia</option>
<option value="Ethiopia">Ethiopia</option>
<option value="Falkland Islands (Malvinas)">Falkland Islands (Malvinas)</option>
<option value="Faroe Islands">Faroe Islands</option>
<option value="Fiji">Fiji</option>
<option value="Finland">Finland</option>
<option value="France">France</option>
<option value="French Guiana">French Guiana</option>
<option value="French Polynesia">French Polynesia</option>
<option value="French Southern Territories">French Southern Territories</option>
<option value="Gabon">Gabon</option>
<option value="Gambia">Gambia</option>
<option value="Georgia">Georgia</option>
<option value="Germany">Germany</option>
<option value="Ghana">Ghana</option>
<option value="Gibraltar">Gibraltar</option>
<option value="Greece">Greece</option>
<option value="Greenland">Greenland</option>
<option value="Grenada">Grenada</option>
<option value="Guadeloupe">Guadeloupe</option>
<option value="Guam">Guam</option>
<option value="Guatemala">Guatemala</option>
<option value="Guernsey">Guernsey</option>
<option value="Guinea">Guinea</option>
<option value="Guinea-Bissau">Guinea-Bissau</option>
<option value="Guyana">Guyana</option>
<option value="Haiti">Haiti</option>
<option value="Heard Island and McDonald Islands">Heard Island and McDonald Islands</option>
<option value="Holy See">Holy See</option>
<option value="Honduras">Honduras</option>
<option value="Hong Kong">Hong Kong</option>
<option value="Hungary">Hungary</option>
<option value="Iceland">Iceland</option>
<option value="India">India</option>
<option value="Indonesia">Indonesia</option>
<option value="Iran (Islamic Republic of)">Iran (Islamic Republic of)</option>
<option value="Iraq">Iraq</option>
<option value="Ireland">Ireland</option>
<option value="Isle of Man">Isle of Man</option>
<option value="Israel">Israel</option>
<option value="Italy">Italy</option>
<option value="Jamaica">Jamaica</option>
<option value="Japan">Japan</option>
<option value="Jersey">Jersey</option>
<option value="Jordan">Jordan</option>
<option value="Kazakhstan">Kazakhstan</option>
<option value="Kenya">Kenya</option>
<option value="Kiribati">Kiribati</option>
<option value="Korea (Democratic People's Republic of)">Korea (Democratic People's Republic of)</option>
<option value="Korea (Republic of)">Korea (Republic of)</option>
<option value="Kuwait">Kuwait</option>
<option value="Kyrgyzstan">Kyrgyzstan</option>
<option value="Lao People's Democratic Republic">Lao People's Democratic Republic</option>
<option value="Latvia">Latvia</option>
<option value="Lebanon">Lebanon</option>
<option value="Lesotho">Lesotho</option>
<option value="Liberia">Liberia</option>
<option value="Libya">Libya</option>
<option value="Liechtenstein">Liechtenstein</option>
<option value="Lithuania">Lithuania</option>
<option value="Luxembourg">Luxembourg</option>
<option value="Macao">Macao</option>
<option value="Macedonia">Macedonia</option>
<option value="Madagascar">Madagascar</option>
<option value="Malawi">Malawi</option>
<option value="Malaysia">Malaysia</option>
<option value="Maldives">Maldives</option>
<option value="Mali">Mali</option>
<option value="Malta">Malta</option>
<option value="Marshall Islands">Marshall Islands</option>
<option value="Martinique">Martinique</option>
<option value="Mauritania">Mauritania</option>
<option value="Mauritius">Mauritius</option>
<option value="Mayotte">Mayotte</option>
<option value="Mexico">Mexico</option>
<option value="Micronesia (Federated States of)">Micronesia (Federated States of)</option>
<option value="Moldova (Republic of)">Moldova (Republic of)</option>
<option value="Monaco">Monaco</option>
<option value="Mongolia">Mongolia</option>
<option value="Montenegro">Montenegro</option>
<option value="Montserrat">Montserrat</option>
<option value="Morocco">Morocco</option>
<option value="Mozambique">Mozambique</option>
<option value="Myanmar">Myanmar</option>
<option value="Namibia">Namibia</option>
<option value="Nauru">Nauru</option>
<option value="Nepal">Nepal</option>
<option value="Netherlands">Netherlands</option>
<option value="New Caledonia">New Caledonia</option>
<option value="New Zealand">New Zealand</option>
<option value="Nicaragua">Nicaragua</option>
<option value="Niger">Niger</option>
<option value="Nigeria">Nigeria</option>
<option value="Niue">Niue</option>
<option value="Norfolk Island">Norfolk Island</option>
<option value="Northern Mariana Islands">Northern Mariana Islands</option>
<option value="Norway">Norway</option>
<option value="Oman">Oman</option>
<option value="Pakistan">Pakistan</option>
<option value="Palau">Palau</option>
<option value="Palestine, State of">Palestine, State of</option>
<option value="Panama">Panama</option>
<option value="Papua New Guinea">Papua New Guinea</option>
<option value="Paraguay">Paraguay</option>
<option value="Peru">Peru</option>
<option value="Philippines">Philippines</option>
<option value="Pitcairn">Pitcairn</option>
<option value="Poland">Poland</option>
<option value="Portugal">Portugal</option>
<option value="Puerto Rico">Puerto Rico</option>
<option value="Qatar">Qatar</option>
<option value="Republic of Kosovo">Republic of Kosovo</option>
<option value="Réunion">Réunion</option>
<option value="Romania">Romania</option>
<option value="Russian Federation">Russian Federation</option>
<option value="Rwanda">Rwanda</option>
<option value="Saint Barthélemy">Saint Barthélemy</option>
<option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option>
<option value="Saint Lucia">Saint Lucia</option>
<option value="Saint Martin (French part)">Saint Martin (French part)</option>
<option value="Saint Pierre and Miquelon">Saint Pierre and Miquelon</option>
<option value="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</option>
<option value="Samoa">Samoa</option>
<option value="San Marino">San Marino</option>
<option value="Sao Tome and Principe">Sao Tome and Principe</option>
<option value="Saudi Arabia">Saudi Arabia</option>
<option value="Senegal">Senegal</option>
<option value="Serbia">Serbia</option>
<option value="Seychelles">Seychelles</option>
<option value="Sierra Leone">Sierra Leone</option>
<option value="Singapore">Singapore</option>
<option value="Sint Maarten (Dutch part)">Sint Maarten (Dutch part)</option>
<option value="Slovakia">Slovakia</option>
<option value="Slovenia">Slovenia</option>
<option value="Solomon Islands">Solomon Islands</option>
<option value="Somalia">Somalia</option>
<option value="South Africa">South Africa</option>
<option value="South Sudan">South Sudan</option>
<option value="Spain">Spain</option>
<option value="Sri Lanka">Sri Lanka</option>
<option value="Sudan">Sudan</option>
<option value="Suriname">Suriname</option>
<option value="Svalbard and Jan Mayen">Svalbard and Jan Mayen</option>
<option value="Swaziland">Swaziland</option>
<option value="Sweden">Sweden</option>
<option value="Switzerland">Switzerland</option>
<option value="Syrian Arab Republic">Syrian Arab Republic</option>
<option value="Taiwan">Taiwan</option>
<option value="Tajikistan">Tajikistan</option>
<option value="Tanzania, United Republic of">Tanzania, United Republic of</option>
<option value="Thailand">Thailand</option>
<option value="Timor-Leste">Timor-Leste</option>
<option value="Togo">Togo</option>
<option value="Tokelau">Tokelau</option>
<option value="Tonga">Tonga</option>
<option value="Trinidad and Tobago">Trinidad and Tobago</option>
<option value="Tunisia">Tunisia</option>
<option value="Turkey">Turkey</option>
<option value="Turkmenistan">Turkmenistan</option>
<option value="Turks and Caicos Islands">Turks and Caicos Islands</option>
<option value="Tuvalu">Tuvalu</option>
<option value="Uganda">Uganda</option>
<option value="Ukraine">Ukraine</option>
<option value="United Arab Emirates">United Arab Emirates</option>
<option value="United Kingdom">United Kingdom</option>
<option value="United States Minor Outlying Islands">United States Minor Outlying Islands</option>
<option value="United States of America">United States of America</option>
<option value="Uruguay">Uruguay</option>
<option value="Uzbekistan">Uzbekistan</option>
<option value="Vanuatu">Vanuatu</option>
<option value="Venezuela (Bolivarian Republic of)">Venezuela (Bolivarian Republic of)</option>
<option value="Viet Nam">Viet Nam</option>
<option value="Virgin Islands (British)">Virgin Islands (British)</option>
<option value="Virgin Islands (U.S.)">Virgin Islands (U.S.)</option>
<option value="Wallis and Futuna">Wallis and Futuna</option>
<option value="Western Sahara">Western Sahara</option>
<option value="Yemen">Yemen</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select>
<p>How would you label your gender? Select all that apply.</p>
<input type='checkbox' id='g1' name='gender.male'>
<label for='g1'>Male</label>
<br>
<input type='checkbox' id='g2' name='gender.female'>
<label for='g2'>Female</label>
<br>
<input type='checkbox' id='g3' name='gender.genderfluid'>
<label for='g3'>Genderfluid</label>
<br>
<input type='checkbox' id='g4' name='gender.genderqueer'>
<label for='g4'>Genderqueer</label>
<br>
<input type='checkbox' id='g5' name='gender.non_binary'>
<label for='g5'>Non-binary</label>
<br>
<input type='checkbox' id='g6' name='gender.agender'>
<label for='g6'>Agender</label>
<br>
<input type='checkbox' id='g7' name='gender.demigender'>
<label for='g7'>Demigender</label>
<br>
<input type='checkbox' id='g8' name='gender.questioning'>
<label for='g8'>Questioning</label>
<br>
<input type='checkbox' id='g9' name='gender.other'>
<label for='g9'>Other</label>
<p>How would you label your ethnicity? Select all that apply.</p>
<input type='checkbox' id='e1' name='ethnicity.east_asian'>
<label for='e1'>East Asian</label>
<br>
<input type='checkbox' id='e2' name='ethnicity.african_american'>
<label for='e2'>Black or African-American</label>
<br>
<input type='checkbox' id='e3' name='ethnicity.hispanic'>
<label for='e3'>Hispanic, Latino, or Spanish origin</label>
<br>
<input type='checkbox' id='e4' name='ethnicity.middle_eastern_north_african'>
<label for='e4'>Middle Eastern or North African</label>
<br>
<input type='checkbox' id='e5' name='ethnicity.native_american'>
<label for='e5'>Native American or Alaska Native</label>
<br>
<input type='checkbox' id='e6' name='ethnicity.pacific_islander'>
<label for='e6'>Native Hawaiian or other Pacific Islander</label>
<br>
<input type='checkbox' id='e7' name='ethnicity.south_asian'>
<label for='e7'>South Asian</label>
<br>
<input type='checkbox' id='e8' name='ethnicity.south_east_asian'>
<label for='e8'>South East Asian</label>
<br>
<input type='checkbox' id='e9' name='ethnicity.subsaharan_african'>
<label for='e9'>Sub-Saharan African</label>
<br>
<input type='checkbox' id='e10' name='ethnicity.white'>
<label for='e10'>White or European origin</label>
<br>
<input type='checkbox' id='e11' name='ethnicity.other'>
<label for='e11'>Other</label>
<p>Which type of hormone replacement therapy do you use?</p>
<input type='radio' id='t1' name='hrt' value='Masculinizing' required>
<label for='t1'>Masculinizing</label>
<br>
<input type='radio' id='t2' name='hrt' value='Feminizing' required>
<label for='t2'>Feminizing</label>
</section>
<section class='all some'>
<h1 class='masc'>Masculinizing</h1>
<h1 class='fem'>Feminizing</h1>
<p>Please input your medication history according to the format seen in the first table below. If you take injections, please specify the volume and concentration in the amount column and specify whether you take intramuscular or subcutaneous injections in the method column. For each change in dosage, please add a new entry. You do not need to fill in a reason for termination for a change in dosage.</p>
<div class='medication'>
<div>
<label for='md5'>Start: </label>
<input id='md5' name='meds[0].start' type='date'>
<br>
<label for='md7'>End: </label>
<input id='md7' name='meds[0].end' type='date'>
<br>
<label for='md6'>Ongoing: </label>
<input id='md6' name='meds[0].frequency' type='checkbox'>
<br>
<label for='md1'>Medication: </label>
<br>
<input id='md1' name='meds[0].med' placeholder='eg. cyproterone acetate' size='20'>
<br>
<label for='md2'>Method: </label>
<br>
<input id='md2' name='meds[0].method' placeholder='eg. topical gel' size='20'>
<br>
<label for='md3'>Amount: </label>
<br>
<input id='md3' name='meds[0].amount' placeholder='eg. 0.5mL at 100mg/mL' size='20'>
<br>
<label for='md4'>Frequency: </label>
<br>
<input id='md4' name='meds[0].frequency' placeholder='eg. bidaily' size='20'>
<br>
<label for='md8'>Reason for Termination: </label>
<br>
<input id='md8' name='meds[0].stop_reason' placeholder='eg. headaches' size='20'>
<br>
</div>
</div>
<button style='margin-top: 1em;' type='button' onclick='row()'>Add Medication</button>
<p></p>
<h2>General Effects</h2>
<p>Please check any of these possible effects you have experienced while taking hormone replacement therapy.</p>
<div class='masc'>
<input type='checkbox' id='me1' name='masc.deeper_voice'>
<label for='me1'>Deeper voice</label>
<br>
<input type='checkbox' id='me2' name='masc.cessation_of_menstruation'>
<label for='me2'>Cessation of menstruation</label>
<br>
<input type='checkbox' id='me3' name='masc.facial_body_hair_growth'>
<label for='me3'>Facial and/or body hair growth</label>
<br>
<input type='checkbox' id='me4' name='masc.thicker_skin'>
<label for='me4'>Thicker skin</label>
<br>
<input type='checkbox' id='me5' name='masc.weight_gain'>
<label for='me5'>Weight gain</label>
<br>
<input type='checkbox' id='me6' name='masc.acne_oily_skin'>
<label for='me6'>More acne or more oily skin</label>
<br>
<input type='checkbox' id='me7' name='masc.male_pattern_baldness'>
<label for='me7'>Male pattern baldness</label>
<br>
<input type='checkbox' id='me8' name='masc.sleep_apnea'>
<label for='me8'>Sleep apnea</label>
<br>
<input type='checkbox' id='me9' name='masc.rise_in_cholesterol'>
<label for='me9'>Rise in cholesterol</label>
<br>
<input type='checkbox' id='me10' name='masc.high_blood_pressure'>
<label for='me10'>High blood pressure</label>
<br>
<input type='checkbox' id='me11' name='masc.polycythemia'>
<label for='me11'>Polycythemia (excess red blood cell production)</label>
<br>
<input type='checkbox' id='me12' name='masc.pelvic_bone_structure'>
<label for='me12'>Changes in pelvic bone structure</label>
<br>
<input type='checkbox' id='me13' name='masc.cramps'>
<label for='me13'>Cramps, potentially related to testosterone administration cycle</label>
<br>
<input type='checkbox' id='me14' name='masc.body_odour'>
<label for='me14'>Changes in body odour</label>
<br>
<input type='checkbox' id='me15' name='masc.fat_redistribution'>
<label for='me15'>Fat redistribution</label>
<br>
<input type='checkbox' id='me16' name='masc.increased_appetite'>
<label for='me16'>Increased appetite</label>
<br>
<input type='checkbox' id='me17' name='masc.decreased_appetite'>
<label for='me17'>Decreased appetite</label>
<br>
<input type='checkbox' id='me18' name='masc.dulled_taste_smell'>
<label for='me18'>Dulled sense of taste or smell</label>
<br>
<input type='checkbox' id='me19' name='masc.increased_irritability'>
<label for='me19'>Increased irritability</label>
<br>
<input type='checkbox' id='me20' name='masc.increased_perspiration'>
<label for='me20'>Increase in perspiration</label>
<br>
<input type='checkbox' id='me21' name='masc.decreased_perspiration'>
<label for='me21'>Decrease in perspiration</label>
<br>
<input type='checkbox' id='me22' name='masc.stronger_nails'>
<label for='me22'>Thicker or stronger nails</label>
<br>
<input type='checkbox' id='me23' name='masc.increased_muscle_mass'>
<label for='me23'>Increased muscle mass</label>
<br>
<input type='checkbox' id='me24' name='masc.face'>
<label for='me24'>Facial feature changes</label>
<br>
<input type='checkbox' id='me25' name='masc.increased_drug_tolerance'>
<label for='me25'>Increased tolerance for caffeine, alcohol, or psychotropics</label>
<br>
<input type='checkbox' id='me26' name='masc.decreased_drug_tolerance'>
<label for='me26'>Reduced tolerance for caffeine, alcohol, or psychotropics</label>
<br>
<input type='checkbox' id='me27' name='masc.improved_sleep'>
<label for='me27'>Improved sleep</label>
<br>
<input type='checkbox' id='me28' name='masc.worsened_sleep'>
<label for='me28'>Worsened sleep</label>
<br>
<input type='checkbox' id='me29' name='masc.improved_smell'>
<label for='me29'>Improved sense of smell</label>
<br>
<input type='checkbox' id='me30' name='masc.worsened_smell'>
<label for='me30'>Worsened sense of smell</label>
<br>
<input type='checkbox' id='me31' name='masc.feeling_warmer'>
<label for='me31'>Feeling warmer</label>
<br>
<input type='checkbox' id='me32' name='masc.feeling_colder'>
<label for='me32'>Feeling colder</label>
<br>
<input type='checkbox' id='me33' name='masc.sex_orientation'>
<label for='me33'>Changes in sexual orientation</label>
<p>Please mention if you have experienced any other changes, specifically non-sexual and not related to genitalia, than those listed above and/or further explain the effects you have experienced below.</p>
<textarea rows='6' cols='80' name='masc.other'></textarea>
<p></p>
</div>
<div class='fem'>
<input type='checkbox' id='fe1' name='fem.softer_skin'>
<label for='fe1'>Skin softening</label>
<br>
<input type='checkbox' id='fe2' name='fem.less_oily_skin'>
<label for='fe2'>Less oily skin</label>
<br>
<input type='checkbox' id='fe3' name='fem.increased_flexibility'>
<label for='fe3'>Increased flexibility</label>
<br>
<input type='checkbox' id='fe4' name='fem.slimmer_hands_wrists'>
<label for='fe4'>Slimmer hands and wrists</label>
<br>
<input type='checkbox' id='fe5' name='fem.smaller_feet'>
<label for='fe5'>Smaller feet</label>
<br>
<input type='checkbox' id='fe6' name='fem.thinner_softer_fingernails'>
<label for='fe6'>Thinner or softer fingernails</label>
<br>
<input type='checkbox' id='fe7' name='fem.reduced_body_hair'>
<label for='fe7'>Reduced body hair</label>
<br>
<input type='checkbox' id='fe8' name='fem.feeling_warmer'>
<label for='fe8'>Feeling warmer</label>
<br>
<input type='checkbox' id='fe9' name='fem.feeling_colder'>
<label for='fe9'>Feeling colder</label>
<br>
<input type='checkbox' id='fe10' name='fem.increased_perspiration'>
<label for='fe10'>Increased perspiration</label>
<br>
<input type='checkbox' id='fe11' name='fem.decreased_perspiration'>
<label for='fe11'>Decreased perspiration</label>
<br>
<input type='checkbox' id='fe12' name='fem.body_odour'>
<label for='fe12'>Changes in body odour</label>
<br>
<input type='checkbox' id='fe13' name='fem.fat_redistribution'>
<label for='fe13'>Fat redistribution</label>
<br>
<input type='checkbox' id='fe14' name='fem.breast_growth'>
<label for='fe14'>Breast growth</label>
<br>
<input type='checkbox' id='fe15' name='fem.reduced_muscle_mass'>
<label for='fe15'>Reduced muscle mass</label>
<br>
<input type='checkbox' id='fe16' name='fem.face'>
<label for='fe16'>Changes in facial features or face shape</label>
<br>
<input type='checkbox' id='fe17' name='fem.hairline'>
<label for='fe17'>Changes in hairline</label>
<br>
<input type='checkbox' id='fe18' name='fem.increased_drug_tolerance'>
<label for='fe18'>Increased tolerance to caffeine, alcohol, or psychotropics</label>
<br>
<input type='checkbox' id='fe19' name='fem.reduced_drug_tolerance'>
<label for='fe19'>Reduced tolerance to caffeine, alcohol, or psychotropics</label>
<br>
<input type='checkbox' id='fe20' name='fem.sex_orientation'>
<label for='fe20'>Changes in sexual orientation</label>
<br>
<input type='checkbox' id='fe21' name='fem.increased_emotional_sensitivity'>
<label for='fe21'>Increased emotional capacity or sensitivity</label>
<br>
<input type='checkbox' id='fe22' name='fem.increased_appetite'>
<label for='fe22'>Increase in appetite</label>
<br>
<input type='checkbox' id='fe23' name='fem.decreased_appetite'>
<label for='fe23'>Decrease in appetite</label>
<br>
<input type='checkbox' id='fe24' name='fem.improved_sleep'>
<label for='fe24'>Improved sleep</label>
<br>
<input type='checkbox' id='fe25' name='fem.worsened_sleep'>
<label for='fe25'>Worsened sleep</label>
<br>
<input type='checkbox' id='fe26' name='fem.improved_smell'>
<label for='fe26'>Improved sense of smell</label>
<br>
<input type='checkbox' id='fe27' name='fem.worsened_smell'>
<label for='fe27'>Worsened sense of smell</label>
<br>
<input type='checkbox' id='fe28' name='fem.taste'>
<label for='fe28'>Changes in taste</label>
<p>Please mention if you have experienced any other changes, specifically non-sexual and not related to genitalia, than those listed above and/or further explain the effects you have experienced below.</p>
<textarea rows='6' cols='80' name='fem.other'></textarea>
<p></p>
</div>
<div class='fem'>
<h2>Cyclical Effects</h2>
<p>Please check any of these possible effects you have experienced while taking hormone replacement therapy.</p>
<input type='checkbox' id='fc1' name='fem.cramping'>
<label for='fc1'>Cramping in intestine or abdomen</label>
<br>
<input type='checkbox' id='fc2' name='fem.bloating'>
<label for='fc2'>Bloating or increased water retention</label>
<br>
<input type='checkbox' id='fc3' name='fem.gas'>
<label for='fc3'>Gas or other intestinal issues</label>
<br>
<input type='checkbox' id='fc4' name='fem.unstable_emotions'>
<label for='fc4'>Emotional instability (mood swings, heightened depression, increased irritability, etc)</label>
<br>
<input type='checkbox' id='fc5' name='fem.pains'>
<label for='fc5'>Muscle or joint aches and pains</label>
<br>
<input type='checkbox' id='fc6' name='fem.breast_tenderness'>
<label for='fc6'>Breast engorgement or nipple tenderness</label>
<br>
<input type='checkbox' id='fc7' name='fem.acne'>
<label for='fc7'>Acne</label>
<br>
<input type='checkbox' id='fc8' name='fem.fatigue'>
<label for='fc8'>Fatigue</label>
<br>
<input type='checkbox' id='fc9' name='fem.appetite_cravings'>
<label for='fc9'>Appetite changes or spontaneous cravings</label>
<br>
<input type='checkbox' id='fc10' name='fem.migraines'>
<label for='fc10'>Migraines</label>
<p>Please mention if you have experienced any other changes, specifically cyclical, than those listed above and/or further explain the effects you have experienced below.</p>
<textarea rows='6' cols='80' name='fem.cycle'></textarea>
<p></p>
</div>
<h2>Sexual Effects</h2>
<p>The following effects pertain to sexuality and genitalia. If you are comfortable answering these questions, please check the following box.</p>
<input type='checkbox' id='sex' name='sex'>
<label for='sex'>I am comfortable and willing to answer questions related to my sexuality and genitalia.</label>
<div class='hide'>
<p>Please check any of these possible effects you have experienced while taking hormone replacement therapy.</p>
<div class='masc'>
<input type='checkbox' id='ms1' name='mascsex.clitoral_growth'>
<label for='ms1'>Clitorial growth</label>
<br>
<input type='checkbox' id='ms2' name='mascsex.vaginal_atrophy'>
<label for='ms2'>Vaginal atrophy</label>
<br>
<input type='checkbox' id='ms3' name='mascsex.vaginal_dryness'>
<label for='ms3'>Vaginal dryness</label>
<br>
<input type='checkbox' id='ms4' name='mascsex.genital_moisture_odour'>
<label for='ms4'>Changes in moisture and odour of genitalia</label>
<br>
<input type='checkbox' id='ms5' name='mascsex.increased_libido'>
<label for='ms5'>Increased libido (higher sex drive)</label>
<br>
<input type='checkbox' id='ms6' name='mascsex.decreased_libido'>
<label for='ms6'>Decreased libido (lower sex drive)</label>
<br>
<input type='checkbox' id='ms7' name='mascsex.orgasm'>
<label for='ms7'>Change in orgasm</label>
<br>
<input type='checkbox' id='ms8' name='mascsex.vaginal_discharge'>
<label for='ms8'>Change in vaginal discharge</label>
<br>
<input type='checkbox' id='ms9' name='mascsex.genital_sensitivity'>
<label for='ms9'>Change in genital sensitivity and/or response</label>
<p>Please mention if you have experienced any other changes, specifically sexual or related to genitalia, than those listed above and/or further explain the effects you have experienced below.</p>
<textarea rows='6' cols='80' name='mascsex.other'></textarea>
<p></p>
</div>
<div class='fem'>
<input type='checkbox' id='fs1' name='femsex.increased_genital_sensitivity'>
<label for='fs1'>Increased genital sensitivity</label>
<br>
<input type='checkbox' id='fs2' name='femsex.genital_moisture_odour'>
<label for='fs2'>Changes in moisture and odour of genitalia</label>
<br>
<input type='checkbox' id='fs3' name='femsex.genital_color_texture'>
<label for='fs3'>Changes in colour or texture of genitalia</label>
<br>
<input type='checkbox' id='fs4' name='femsex.fewer_erections'>
<label for='fs4'>Fewer erections</label>
<br>
<input type='checkbox' id='fs5' name='femsex.clear_ejaculate'>
<label for='fs5'>Clear ejaculate</label>
<br>
<input type='checkbox' id='fs6' name='femsex.testicular_atrophy'>
<label for='fs6'>Testicular atrophy</label>
<br>
<input type='checkbox' id='fs7' name='femsex.genital_response'>
<label for='fs7'>Increased arousing response to genital touch</label>
<br>
<input type='checkbox' id='fs8' name='femsex.orgasm'>
<label for='fs8'>Changes in orgasm</label>
<br>
<input type='checkbox' id='fs9' name='femsex.increased_libido'>
<label for='fs9'>Increased libido</label>
<br>
<input type='checkbox' id='fs10' name='femsex.decreased_libido'>
<label for='fs10'>Reduced libido</label>
<p>Please mention if you have experienced any other changes, specifically sexual or related to genitalia, than those listed above and/or further explain the effects you have experienced below.</p>
<textarea rows='6' cols='80' name='femsex.other'></textarea>
<p></p>
</div>
</div>
</section>
<section class='all some'>
<h1>General</h1>
<p>Are you taking or have you taken medications not classified as a part of hormone replacement therapy which may affect, cause, or interfere with any of the effects listed above?</p>
<textarea rows='6' cols='80' name='entry.medication'></textarea>
<p>Do you have any medical conditions which may affect, cause, or interfere with any of the effects listed above?</p>
<textarea rows='6' cols='80' name='entry.conditions'></textarea>
<br>
<br>
<input type='checkbox' id='btst' name='entry.blood-test'>
<label for='btst'>I have gotten a blood test within the last year</label>
</section>
<section class='all some'>
<h1>Final Thoughts</h1>
<p>How did you hear about this survey?</p>
<textarea rows='6' cols='80' name='entry.heard'></textarea>
<p>Is there anything related to your hormone replacement therapy that you would like us to know?</p>
<textarea rows='6' cols='80' name='entry.other'></textarea>
<p>Do you have any other feedback for HRTimelines?</p>
<textarea rows='6' cols='80' name='entry.feedback'></textarea>
<br>
<br>
<input type='submit' value='Submit'>
</section>
</main>
</body>
</html>

10
gen/future.md Normal file
View File

@@ -0,0 +1,10 @@
Future Plans
Our primary goal is to provide trans people with evidence-based expectations for their medical transition. Currently, we run surveys asking healthcare questions and present that data to reach our goal. We also want to inform trans health decision-making and answer key questions about trans healthcare with evidence. These questions could include the effectiveness of progesterone or the impacts different injection techniques have on physical effects.
Our short term goals include:
- Designing data visualization for our website
- Developing longitudinal research to gain a better resolution of changes over time
- Collecting more information on specific parts of transition
- Increasing our outreach into different trans communities
- Building a community of volunteers to support HRTimelines
We are interested in creating better documentation of our findings, including reports and detailed reviews. We look forward to seeing where this project is going, and we are always looking for feedback and good ideas. If you would like to get in touch, check out our [contacts page](https://hrtimelines.com/contact)!

2
gen/hamburger.svg Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M6.001 7.128L6 10.438l19.998-.005L26 7.124zM6.001 21.566L6 24.876l19.998-.006.002-3.308zM6.001 14.341L6 17.65l19.998-.004.002-3.309z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

32
gen/head.html Normal file
View File

@@ -0,0 +1,32 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width'>
<meta name='description' content='Trans Healthcare Survey Research Website'>
<link rel='stylesheet' href='style.css'>
<script src="https://code.jquery.com/jquery-3.7.1.slim.min.js" integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=" crossorigin="anonymous"></script>
<script src="script.js"></script>
<link rel='icon' href='logo.webp'>
<title>HRTimelinesTITLE</title>
</head>
<body>
<script>0</script>
<main>
<header>
<div>
<a href='https://hrtimelines.com'><img src='logo.webp' alt='logo' width='50rem' height='50rem'></a>
<h1><a href='https://hrtimelines.com'>HRTimelines</a></h1>
</div>
<div id='nav'>
<img id='hamburger' src='hamburger.svg' alt='nav' width='30rem' height='30rem'>
<nav>
<a href='https://hrtimelines.com'>Home</a>
<a href='https://hrtimelines.com/about'>About</a>
<a href='https://hrtimelines.com/future'>Future Plans</a>
<a href='https://hrtimelines.com/contact'>Contact</a>
<a href='https://hrtimelines.com/form'>Form</a>
</nav>
</div>
</header>
<section>

5
gen/index.md Normal file
View File

@@ -0,0 +1,5 @@
HRTimelines is a trans healthcare research project by trans people for trans people. We study the physical effects of Hormone Replacement Therapy (HRT) in transgender individuals through survey based research. Our goal is to create better timelines for the effects of HRT while taking into account other factors including application method, dosage, age, and ethnicity.
Our first survey was built in Google Forms and launched in early January, 2023. We received over 150 responses from trans people all around the world, and we have found many interesting insights. The data is still being analyzed, and we hope to share results on our website soon.
Currently, we are collecting responses for the second version of our survey and working on developing longitudinal studies. These will collect more data on individuals, gaining a better understanding of how HRT affects people over time. We are also getting ready to start a project studying the effects of progesterone in transfeminine people. If you are interested in participating and on HRT, follow us on [Instagram](https://instagram.com/hrtimelines?igshid=MzMyNGUyNmU2YQ%3D%3D&utm_source=qr) and shoot us an [email](mailto:hrtimelines@gmail.com). If you have other questions or feedback, check out our [contacts page](https://hrtimelines.com/contact)!
We are currently collecting data on when trans people start HRT, what medications they use, and what physical effects they have experienced. If you are interested in participating, please fill out [this form](https://hrtimelines.com/form).

BIN
gen/logo.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

58
gen/script.js Normal file
View File

@@ -0,0 +1,58 @@
function con() {
if ($('input[class=con]:checked').length == 2) {
$('.all').show();
hrt();
} else {
$('.all').hide();
}
}
function hrt() {
const val = $('input[name=hrt]:checked').attr('id');
var chk = '';
if (val == 't1')
chk = 'masc';
else if (val == 't2')
chk = 'fem';
if (chk == 'masc' || chk == 'fem') {
$('.some').show();
$('.' + chk).show();
const not = chk == 'masc' ? 'fem' : 'masc';
$('.' + not).hide();
} else {
$('.some').hide();
}
}
function sex() {
if ($('input[name=sex]:checked').length == 1) {
$('.hide').show();
hrt();
} else {
$('.hide').hide();
}
}
$(document).ready(function() { con(); hrt(); sex(); });
$(document).on('change', 'input[class=con]', con);
$(document).on('change', 'input[name=hrt]', hrt);
$(document).on('change', 'input[name=sex]', sex);
var num = 1;
function row() {
let text = $('.medication div:first').html()
let newtext = text.replace(/\[0\]/g, '[' + num + ']');
$('.medication').append('<div>' + newtext + '</div>');
}
var opened = false;
$(document).on('click', function(event) {
if (event.target.id == 'hamburger' && !opened) {
$('nav').css('display', 'block');
opened = true;
} else {
$('nav').css('display', 'none');
opened = false;
}
});

208
gen/style.css Normal file
View File

@@ -0,0 +1,208 @@
:root {
--w: #F6F7F7;
--d: #000000;
--b: #2BD2FF;
--p: #FC9DB8;
--g: #545454;
--h: #54545450;
}
::selection {
background-color: var(--h);
}
html {
color: var(--d);
background-color: var(--w);
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
font-feature-settings:normal;
font-variation-settings:normal
font-size: 12pt;
line-height: 1.5em;
word-spacing: 0.04ch;
overflow-x: hidden;
height: 100%;
}
body {
margin: 0;
padding: 0 0.75em;
overflow-x: hidden;
height: 100%;
}
body > * {
width: 100%;
max-width: max(70ch, 60%);
margin: 0 auto;
margin-bottom: 1em;
}
header {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
border-image: repeating-linear-gradient(to right,
var(--b), var(--b) 5px, transparent 5px, transparent 10px,
var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px);
border-image-width: 0 0 3px 0;
border-image-slice: 1;
margin-bottom: 1rem;
}
header img {
margin: 0.5rem 1rem 0.5rem 0;
}
header div {
display: flex;
flex-direction: row;
align-items: center;
}
#nav {
position: relative;
}
#hamburger:hover, #hamburger:focus, #hamburger:active {
cursor: pointer;
}
#nav img {
padding: 0;
margin: 0;
}
nav {
position: absolute;
display: none;
z-index: 1;
background-color: var(--w);
right: 0px;
top: 35px;
min-width: 160px;
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
}
nav a {
display: block;
text-align: right;
border-image: repeating-linear-gradient(to right,
var(--b), var(--b) 5px, transparent 5px, transparent 10px,
var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px);
border-image-width: 2px 0 0 0;
border-image-slice: 1;
padding: 4px 4px 4px 0;
margin: 0;
}
nav a:last-child {
border-image-width: 2px 0 2px 0;
}
a {
color: var(--d);
text-decoration: none;
transition-property: color;
transition-duration: 0.5s;
}
a:not(header a) {
border-image: repeating-linear-gradient(to right,
var(--b), var(--b) 5px, transparent 5px, transparent 10px,
var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px);
border-image-width: 0 0 2px 0;
border-image-slice: 1;
}
a:hover, a:focus, a:active {
color: var(--g);
}
h1 {
font-size: 24pt;
font-weight: 700;
}
h1:not(header h1), h2 {
margin: 0;
padding-bottom: 0.5em;
border-image: repeating-linear-gradient(to right,
var(--b), var(--b) 5px, transparent 5px, transparent 10px,
var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px);
border-image-width: 0 0 3px 0;
border-image-slice: 1;
}
section + section {
margin-top: 2.5em;
}
.medication div {
border-image: repeating-linear-gradient(to right,
var(--b), var(--b) 5px, transparent 5px, transparent 10px,
var(--p) 10px, var(--p) 15px, transparent 15px, transparent 20px);
border-image-width: 2px 0 0 0;
border-image-slice: 1;
padding: 1em;
}
.medication div:last-child {
border-image-width: 2px 0 2px 0;
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
ul li::before {
content: "";
margin: 0.25em 0;
padding-right: 1em;
}
ul li {
position: relative;
left: 1.5em;
margin: 0.25em 1.5em 0.25em 0;
text-indent: -1.5em;
}
table {
overflow: scroll;
display: inline-block;
max-width: 70ch;
padding-bottom: 10px;
}
td {
white-space: nowrap;
padding: 0 5px;
}
div:not(header div) {
padding: 0;
margin: 0;
border: 0;
}
textarea {
max-width: calc(100% - 0.75em);
}

2
gen/thanks.md Normal file
View File

@@ -0,0 +1,2 @@
Thanks!
Thank you for submitting the form. Your response has been received.

149
md.py Executable file
View File

@@ -0,0 +1,149 @@
#!/bin/python3
# hrtime - transgender research website
# Copyright (C) 2025 Olive <hello@grasswren.net>
# see LICENCE file for licensing information
import re
import sys
def ch(st: str) -> str:
st = re.sub(r'&', r'&amp;', st)
st = re.sub(r'>', r'&gt;', st)
st = re.sub(r'<', r'&lt;', st)
return st
def qch(st: str) -> str:
return re.sub('\'', r'&apos;', ch(st))
def mdh(line: str) -> str:
ret = ''
while len(line) > 0:
match = re.match(r'!\[(.*?)\]\((.*?)\)', line)
if match != None:
line = line[match.span()[1]:]
ret += f"<span class='n' title='{qch(match.group(2))}'>" + \
f'{ch(match.group(1))}</span>'
continue
match = re.match(r'\[(.*?)\]\(([^ ]*)\)', line)
if match != None:
line = line[match.span()[1]:]
ret += f"<a href='{qch(match.group(2))}' target='_blank'" \
+ f'>{ch(match.group(1))}</a>'
continue
match = re.match(r'`(.)(.*?)`', line)
if match != None:
line = line[match.span()[1]:]
ret += r"<code" + (f" class='{match.group(1)}'" if match.group(1) \
!= '/' else '') + f'>{ch(match.group(2))}</code>'
continue
ret += ch(line[0])
line = line[1:]
ret = re.sub(r'NOBREAK', r'&NoBreak;', ret)
return ret
def md(line: str) -> str:
# allows '|' and '||' escaping to work
ret, do = '', True
for sec in line.strip().split('|'):
if len(sec) == 0:
ret += '|'
else:
ret += mdh(sec) if do else sec
do = not do
return ret
def media(line: str):
file, alt = tuple(line.strip().split('|'))
file = qch(file)
if file[-5:] in ('.webp'):
print(f"<img src='{file}' alt='{qch(alt)}'>")
if file[-4:] in ('.mp4'):
print('<video controls>')
print(f"<source src='{file}' type='video/mp4' alt='{qch(alt)}'>")
print('</video>')
if file[-4:] in ('.pdf'):
print(f"<object data='{file}' type='application/pdf' height='80%'>")
print(f"<a href='{file}'>{ch(alt)}</a>")
print('</object>')
def doc(lines: list[str]):
head = ''
with open('head.html', 'r') as file:
head = file.read()
lines[0] = lines[0].strip()
if len(lines[0]) > 0:
lines[0] = '' + lines[0]
head = re.sub(r'TITLE', lines[0], head, count=2)
print(head, end='')
lines = lines[1:]
mode=''
for line in lines:
if line[1:4] == ' ':
if mode != '</code></pre>':
if line[0] != '/':
cls = f" class='{line[0]}'"
print(f'<pre><code{cls}>', end='')
mode = '</code></pre>'
print(ch(line[4:].rstrip()))
continue
elif line[:2] == ' ':
if mode != '</ul>':
print("<ul class='l'>")
mode = '</ul>'
print(f'<li>{md(line[2:])}</li>')
continue
elif line[:2] == '- ':
if mode != '</ul>':
print('<ul>')
mode = '</ul>'
print(f'<li>{md(line[2:])}</li>')
continue
if mode != '':
print(mode)
mode = ''
if len(line) == 1:
print('</section>\n<section>')
elif line[:2] == '# ':
print(f'<h1>{md(line[2:])}</h1>')
elif line[:3] == '## ':
print(f'<h2>{md(line[3:])}</h2>')
elif line[:2] == '! ':
media(line[2:])
elif line[:2] == '@ ':
title, link, desc, date = tuple(line[2:].split('|'))
print('<article>\n<div>')
print(f"<h1><a href='{qch(link)}'>{md(title)}</a></h1>")
print('</div>\n<div>')
print(f'<p>{md(desc)}</p>')
print(f'<p>(<time>{date.strip()}</time>)</p>')
print('</div>\n</article>')
else:
print('<p>' + md(line) + '</p>')
if mode != '':
print(mode)
with open('foot.html', 'r') as file:
print(file.read(), end='')
if __name__ == '__main__':
if len(sys.argv) != 2:
print('usage: md [file]')
else:
with open(sys.argv[1], 'r') as file:
doc(list(file))

99
src/form.rs Normal file
View File

@@ -0,0 +1,99 @@
/* hrtime - transgender survey website
* Copyright (C) 2025 Olive <hello@grasswren.net>
* see LICENCE file for licensing information */
use std::path::Path;
use diesel::insert_into;
use diesel::RunQueryDsl;
use rocket::form::{Form, FromForm};
use rocket::fs::NamedFile;
use crate::Database;
use crate::models;
use crate::schema::*;
#[derive(FromForm, Debug)]
pub struct Primary {
hrt: String,
sex: bool,
entry: models::Entry,
gender: models::Gender,
ethnicity: models::Ethnicity,
meds: Vec<models::Medication>,
masc: models::Masculine,
mascsex: models::MasculineSex,
fem: models::Feminine,
femsex: models::FeminineSex,
}
#[rocket::post("/", data="<form>")]
pub async fn form(
mut form: Form<Primary>,
conn: Database,
) -> Option<NamedFile> {
let entry = form.entry.clone();
let id = conn.run(|conn| insert_into(entry::table)
.values(entry)
.returning(entry::dsl::id)
.get_result::<Option<i32>>(conn)
.unwrap()).await.unwrap();
form.gender.entry = id;
form.ethnicity.entry = id;
for med in form.meds.iter_mut() {
med.entry = id;
}
let gender = form.gender.clone();
conn.run(|conn| insert_into(gender::table)
.values(gender)
.execute(conn)
.unwrap()).await;
let ethnicity = form.ethnicity.clone();
conn.run(|conn| insert_into(ethnicity::table)
.values(ethnicity)
.execute(conn)
.unwrap()).await;
let meds = form.meds.clone();
conn.run(|conn| insert_into(medication::table)
.values(meds)
.execute(conn)
.unwrap()).await;
if form.hrt == "Masculinizing" {
form.masc.entry = id;
let masc = form.masc.clone();
conn.run(|conn| insert_into(masculine::table)
.values(masc)
.execute(conn)
.unwrap()).await;
if form.sex {
form.mascsex.entry = id;
let mascsex = form.mascsex.clone();
conn.run(|conn| insert_into(masculine_sex::table)
.values(mascsex)
.execute(conn)
.unwrap()).await;
}
} else {
form.fem.entry = id;
let fem = form.fem.clone();
conn.run(|conn| insert_into(feminine::table)
.values(fem)
.execute(conn)
.unwrap()).await;
if form.sex {
form.femsex.entry = id;
let femsex = form.femsex.clone();
conn.run(|conn| insert_into(feminine_sex::table)
.values(femsex)
.execute(conn)
.unwrap()).await;
}
}
return NamedFile::open(Path::new("/var/www/thanks.html")).await.ok();
}

50
src/main.rs Normal file
View File

@@ -0,0 +1,50 @@
/* hrtime - transgender survey website
* Copyright (C) 2025 Olive <hello@grasswren.net>
* see LICENCE file for licensing information */
pub mod schema;
pub mod models;
pub mod form;
use std::path::{Path, PathBuf};
use rocket::Request;
use rocket::fs::NamedFile;
use rocket_sync_db_pools::{database, diesel};
#[database("db")]
pub struct Database(diesel::SqliteConnection);
#[rocket::get("/<file..>")]
async fn files(file: PathBuf) -> Option<NamedFile> {
let pages = vec!["about", "future", "contact", "form", "thanks"];
let other = vec!["hamburger.svg", "logo.webp", "script.js", "style.css"];
let mut path = match file.to_str() {
Some(path) => path.to_owned(),
None => return NamedFile::open(Path::new("/var/www/404.html")).await.ok(),
};
if path == "" {
path = "index.html".to_string();
} else if pages.contains(&path.as_str()) {
path += ".html";
} else if !other.contains(&path.as_str()) {
path = "404.html".to_string();
}
NamedFile::open(Path::new("/var/www/").join(path)).await.ok()
}
#[rocket::catch(404)]
async fn not_found(_: &Request<'_>) -> Option<NamedFile> {
NamedFile::open(Path::new("/var/www/404.html")).await.ok()
}
#[rocket::launch]
fn rocket() -> _ {
rocket::build()
.attach(Database::fairing())
.mount("/form", rocket::routes![form::form])
.mount("/", rocket::routes![files])
.register("/", rocket::catchers![not_found])
}

202
src/models.rs Normal file
View File

@@ -0,0 +1,202 @@
/* hrtime - transgender survey website
* Copyright (C) 2025 Olive <hello@grasswren.net>
* see LICENCE file for licensing information */
use diesel::prelude::*;
use rocket::form::FromForm;
use crate::schema::*;
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = entry)]
pub struct Entry {
birthdate: String,
country: String,
medication: String,
conditions: String,
other: String,
blood_test: bool,
feedback: String,
heard: String,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = gender)]
pub struct Gender {
#[field(default = 0)]
pub entry: i32,
male: bool,
female: bool,
nonbinary: bool,
agender: bool,
genderfluid: bool,
genderqueer: bool,
demigender: bool,
questioning: bool,
other: bool,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = ethnicity)]
pub struct Ethnicity {
#[field(default = 0)]
pub entry: i32,
african_american: bool,
east_asian: bool,
south_asian: bool,
southeast_asian: bool,
hispanic: bool,
middle_eastern_north_african: bool,
subsaharan_african: bool,
white: bool,
native_american: bool,
pacific_islander: bool,
other: bool,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = medication)]
pub struct Medication {
#[field(default = 0)]
pub entry: i32,
med: String,
method: String,
amount: String,
frequency: String,
start: String,
end: String,
ongoing: bool,
stop_reason: String,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = masculine)]
pub struct Masculine {
#[field(default = 0)]
pub entry: i32,
thicker_skin: bool,
acne_oily_skin: bool,
stronger_nails: bool,
increased_perspiration: bool,
decreased_perspiration: bool,
body_odour: bool,
facial_body_hair_growth: bool,
male_pattern_baldness: bool,
weight_gain: bool,
pelvic_bone_structure: bool,
fat_redistribution: bool,
increased_muscle_mass: bool,
face: bool,
increased_irritability: bool,
sex_orientation: bool,
improved_smell: bool,
worsened_smell: bool,
dulled_taste_smell: bool,
deeper_voice: bool,
cessation_of_menstruation: bool,
sleep_apnea: bool,
rise_in_cholesterol: bool,
high_blood_pressure: bool,
polycythemia: bool,
cramps: bool,
increased_appetite: bool,
decreased_appetite: bool,
increased_drug_tolerance: bool,
decreased_drug_tolerance: bool,
improved_sleep: bool,
worsened_sleep: bool,
feeling_warmer: bool,
feeling_colder: bool,
other: String,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = masculine_sex)]
pub struct MasculineSex {
#[field(default = 0)]
pub entry: i32,
genital_moisture_odour: bool,
clitoral_growth: bool,
vaginal_atrophy: bool,
vaginal_dryness: bool,
vaginal_discharge: bool,
genital_sensitivity: bool,
orgasm: bool,
increased_libido: bool,
decreased_libido: bool,
other: String,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = feminine)]
pub struct Feminine {
#[field(default = 0)]
pub entry: i32,
softer_skin: bool,
less_oily_skin: bool,
thinner_softer_fingernails: bool,
increased_perspiration: bool,
decreased_perspiration: bool,
body_odour: bool,
reduced_body_hair: bool,
hairline: bool,
slimmer_hands_wrists: bool,
smaller_feet: bool,
breast_growth: bool,
fat_redistribution: bool,
reduced_muscle_mass: bool,
face: bool,
increased_emotionality_sensitivity: bool,
sex_orientation: bool,
improved_smell: bool,
worsened_smell: bool,
taste: bool,
increased_flexibility: bool,
increased_appetite: bool,
decreased_appetite: bool,
increased_drug_tolerance: bool,
decreased_drug_tolerance: bool,
feeling_warmer: bool,
feeling_colder: bool,
improved_sleep: bool,
worsened_sleep: bool,
other: String,
cramping: bool,
bloating: bool,
gas: bool,
unstable_emotions: bool,
pains: bool,
breast_tenderness: bool,
acne: bool,
fatigue: bool,
appetite_cravings: bool,
migranes: bool,
cycle: String,
}
#[derive(Insertable, FromForm, Clone, Debug)]
#[diesel(table_name = feminine_sex)]
pub struct FeminineSex {
#[field(default = 0)]
pub entry: i32,
genital_moisture_odour: bool,
genital_color_texture: bool,
fewer_erections: bool,
clear_ejaculate: bool,
testicular_atrophy: bool,
increased_genital_sensitivity: bool,
genital_response: bool,
orgasm: bool,
increased_libido: bool,
decreased_libido: bool,
other: String,
}

207
src/schema.rs Normal file
View File

@@ -0,0 +1,207 @@
// @generated automatically by Diesel CLI.
diesel::table! {
entry (id) {
id -> Nullable<Integer>,
timestamp -> Nullable<Timestamp>,
birthdate -> Timestamp,
country -> Text,
medication -> Text,
conditions -> Text,
other -> Text,
blood_test -> Bool,
feedback -> Text,
heard -> Text,
}
}
diesel::table! {
ethnicity (id) {
id -> Nullable<Integer>,
entry -> Integer,
african_american -> Bool,
east_asian -> Bool,
south_asian -> Bool,
southeast_asian -> Bool,
hispanic -> Bool,
middle_eastern_north_african -> Bool,
subsaharan_african -> Bool,
white -> Bool,
native_american -> Bool,
pacific_islander -> Bool,
other -> Nullable<Bool>,
}
}
diesel::table! {
feminine (id) {
id -> Nullable<Integer>,
entry -> Integer,
softer_skin -> Bool,
less_oily_skin -> Bool,
thinner_softer_fingernails -> Bool,
increased_perspiration -> Bool,
decreased_perspiration -> Bool,
body_odour -> Bool,
reduced_body_hair -> Bool,
hairline -> Bool,
slimmer_hands_wrists -> Bool,
smaller_feet -> Bool,
breast_growth -> Bool,
fat_redistribution -> Bool,
reduced_muscle_mass -> Bool,
face -> Bool,
increased_emotionality_sensitivity -> Bool,
sex_orientation -> Bool,
improved_smell -> Bool,
worsened_smell -> Bool,
taste -> Bool,
increased_flexibility -> Bool,
increased_appetite -> Bool,
decreased_appetite -> Bool,
increased_drug_tolerance -> Bool,
decreased_drug_tolerance -> Bool,
feeling_warmer -> Bool,
feeling_colder -> Bool,
improved_sleep -> Bool,
worsened_sleep -> Bool,
other -> Text,
cramping -> Bool,
bloating -> Bool,
gas -> Bool,
unstable_emotions -> Bool,
pains -> Bool,
breast_tenderness -> Bool,
acne -> Bool,
fatigue -> Bool,
appetite_cravings -> Bool,
migranes -> Bool,
cycle -> Text,
}
}
diesel::table! {
feminine_sex (id) {
id -> Nullable<Integer>,
entry -> Integer,
genital_moisture_odour -> Bool,
genital_color_texture -> Bool,
fewer_erections -> Bool,
clear_ejaculate -> Bool,
testicular_atrophy -> Bool,
increased_genital_sensitivity -> Bool,
genital_response -> Bool,
orgasm -> Bool,
increased_libido -> Bool,
decreased_libido -> Bool,
other -> Text,
}
}
diesel::table! {
gender (id) {
id -> Nullable<Integer>,
entry -> Integer,
male -> Bool,
female -> Bool,
nonbinary -> Bool,
agender -> Bool,
genderfluid -> Bool,
genderqueer -> Bool,
demigender -> Bool,
questioning -> Bool,
other -> Bool,
}
}
diesel::table! {
masculine (id) {
id -> Nullable<Integer>,
entry -> Integer,
thicker_skin -> Bool,
acne_oily_skin -> Bool,
stronger_nails -> Bool,
increased_perspiration -> Bool,
decreased_perspiration -> Bool,
body_odour -> Bool,
facial_body_hair_growth -> Bool,
male_pattern_baldness -> Bool,
weight_gain -> Bool,
pelvic_bone_structure -> Bool,
fat_redistribution -> Bool,
increased_muscle_mass -> Bool,
face -> Bool,
increased_irritability -> Bool,
sex_orientation -> Bool,
improved_smell -> Bool,
worsened_smell -> Bool,
dulled_taste_smell -> Bool,
deeper_voice -> Bool,
cessation_of_menstruation -> Bool,
sleep_apnea -> Bool,
rise_in_cholesterol -> Bool,
high_blood_pressure -> Bool,
polycythemia -> Bool,
cramps -> Bool,
increased_appetite -> Bool,
decreased_appetite -> Bool,
increased_drug_tolerance -> Bool,
decreased_drug_tolerance -> Bool,
improved_sleep -> Bool,
worsened_sleep -> Bool,
feeling_warmer -> Bool,
feeling_colder -> Bool,
other -> Text,
}
}
diesel::table! {
masculine_sex (id) {
id -> Nullable<Integer>,
entry -> Integer,
genital_moisture_odour -> Bool,
clitoral_growth -> Bool,
vaginal_atrophy -> Bool,
vaginal_dryness -> Bool,
vaginal_discharge -> Bool,
genital_sensitivity -> Bool,
orgasm -> Bool,
increased_libido -> Bool,
decreased_libido -> Bool,
other -> Text,
}
}
diesel::table! {
medication (id) {
id -> Nullable<Integer>,
entry -> Integer,
med -> Text,
method -> Text,
amount -> Text,
frequency -> Text,
start -> Timestamp,
end -> Timestamp,
ongoing -> Bool,
stop_reason -> Text,
}
}
diesel::joinable!(ethnicity -> entry (entry));
diesel::joinable!(feminine -> entry (entry));
diesel::joinable!(feminine_sex -> entry (entry));
diesel::joinable!(gender -> entry (entry));
diesel::joinable!(masculine -> entry (entry));
diesel::joinable!(masculine_sex -> entry (entry));
diesel::joinable!(medication -> entry (entry));
diesel::allow_tables_to_appear_in_same_query!(
entry,
ethnicity,
feminine,
feminine_sex,
gender,
masculine,
masculine_sex,
medication,
);