Major changes to the database structure: Delete and recreate the whole database (would require too many migrations otherwise). Removed a market, updated some images, added to the AP page, and merged bios.

This commit is contained in:
Wynne Crisman
2016-06-26 11:16:00 -07:00
parent abee7df2eb
commit a57900c065
16 changed files with 163 additions and 247 deletions

View File

@@ -1,3 +1,4 @@
var Promise = require('bluebird');
module.exports = function(sequelize) {
var models = sequelize.models;
@@ -23,7 +24,7 @@ module.exports = function(sequelize) {
models.Measure.create({name: 'Jar 64oz', postfix: '64oz'}),
models.Measure.create({name: 'Pounds', postfix: 'lbs'}),
models.Measure.create({name: 'Each', postfix: ''}),
models.Measure.create({name: 'Bags', postfix: 'bags'}),
models.Measure.create({name: 'Bags', postfix: 'bags'})
], function(value, index, length) {
//Collect the first 5 jar ids.
if(index < 5) basicJarIds.push(value.id);
@@ -31,79 +32,79 @@ module.exports = function(sequelize) {
models.Category.create({name: 'VAP'}).then(function(category) {
models.Subcategory.create({name: 'Soups'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Fava Bean Bisque', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Fava Bean Bisque', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Tomato Basil Soup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Tomato Basil Soup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Winter Squash Soup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Winter Squash Soup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});
models.Subcategory.create({name: 'Drink Mixes & Syrups'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Bloody Mary Mix', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Bloody Mary Mix', defaultPrice: 12, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Grape Syrup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Grape Syrup', defaultPrice: 8, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Prickly Pear Syrup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Prickly Pear Syrup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Quince Syrup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Quince Syrup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Strawberry Syrup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Strawberry Syrup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Wild Plum Syrup', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Wild Plum Syrup', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});
models.Subcategory.create({name: 'Fermented'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Napa Cabbage Sauerkraut', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Napa Cabbage Sauerkraut', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Napa Cabbage Sauerkraut w/ Watercress & Espelette Pepper', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Napa Cabbage Sauerkraut w/ Watercress & Espelette Pepper', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Red Sauerkraut', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Red Sauerkraut', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});
models.Subcategory.create({name: 'Dried Goods'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Dried Strawberries', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Dried Strawberries', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Membrillo', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Membrillo', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Sugared Jalape<70>os', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Sugared Jalape<70>os', defaultPrice: 10, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});
models.Subcategory.create({name: 'Spices'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Basque Pepper Powder', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Basque Pepper Powder', defaultPrice: 8, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Korean Pepper Powder', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Korean Pepper Powder', defaultPrice: 8, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Smoked Basque Pepper Powder', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Smoked Basque Pepper Powder', defaultPrice: 8, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
models.Item.create({name: 'Smoked Korean Pepper Powder', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Smoked Korean Pepper Powder', defaultPrice: 8, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});
models.Subcategory.create({name: 'Specialty'}).then(function(subcategory) {
category.addSubcategory(subcategory);
models.Item.create({name: 'Pure Lard', counts: COUNTS_JAR}).then(function(item) {
models.Item.create({name: 'Pure Lard', defaultPrice: 4, measures: basicJarIds}).then(function(item) {
subcategory.addItem(item);
});
});

View File

@@ -15,6 +15,14 @@ module.exports = {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -27,6 +27,14 @@ module.exports = {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -19,6 +19,14 @@ module.exports = {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -19,6 +19,14 @@ module.exports = {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -30,6 +30,14 @@ module.exports = {
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -15,10 +15,14 @@ module.exports = {
type: DataTypes.STRING,
allowNull: false
},
counts: {
measures: {
type: DataTypes.JSON,
allowNull: false
},
defaultPrice: {
type: DataTypes.DECIMAL(9,2),
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
@@ -32,6 +36,14 @@ module.exports = {
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -12,11 +12,25 @@ module.exports = {
autoIncrement: true
},
date: {
type: DataTypes.DATE,
type: DataTypes.DATEONLY,
allowNull: false
},
quantity: {
type: DataTypes.DECIMAL(13,2),
allowNull: false
},
price: {
type: DataTypes.DECIMAL(13,4),
allowNull: false
},
measure: {
type: DataTypes.JSONB,
type: Sequelize.INTEGER,
references: {
model: 'Measure',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade',
allowNull: false
},
itemId: {
@@ -36,6 +50,14 @@ module.exports = {
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
createdAt: {
type: DataTypes.DATE,
allowNull: false
},
updatedAt: {
type: DataTypes.DATE,
allowNull: false
}
}, {
charset: 'utf8'

View File

@@ -1,203 +0,0 @@
'use strict';
module.exports = {
up: function (query, Sequelize) {
var DataTypes = Sequelize; //Allow for more cut and paste :)
return query.createTable('User', {
login: {
type: DataTypes.STRING
},
password: {
type: DataTypes.STRING
},
admin: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
}, {
charset: 'utf8'
});
query.addIndex('User', ['login'], {indicesType: 'UNIQUE', indexName: 'LOGIN_INDEX'});
query.createTable('Measure', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
image: {
type: DataTypes.STRING,
allowNull: true
},
postfix: {
type: DataTypes.STRING,
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
}, {
charset: 'utf8'
});
query.createTable('Venue', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
}, {
charset: 'utf8'
});
query.createTable('Category', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
}
}, {
charset: 'utf8'
});
query.createTable('Subcategory', {
id: {
type: DataTypes.INTEGER,
field: 'id',
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
field: 'name',
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
categoryId: {
type: Sequelize.INTEGER,
references: {
model: 'Category',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
}
}, {
charset: 'utf8'
});
query.createTable('Item', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name: {
type: DataTypes.STRING,
allowNull: false
},
counts: {
type: DataTypes.JSON,
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
subcategoryId: {
type: Sequelize.INTEGER,
references: {
model: 'Subcategory',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
}
}, {
charset: 'utf8'
});
query.createTable('Sale', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
allowNull: false,
autoIncrement: true
},
date: {
type: DataTypes.DATE,
allowNull: false
},
measure: {
type: DataTypes.JSONB,
allowNull: false
},
itemId: {
type: Sequelize.INTEGER,
references: {
model: 'Item',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
},
venueId: {
type: Sequelize.INTEGER,
references: {
model: 'Venue',
key: 'id'
},
onUpdate: 'cascade',
onDelete: 'cascade'
}
}, {
charset: 'utf8'
});
},
down: function (query, Sequelize) {
query.dropTable('Sale');
query.dropTable('Item');
query.dropTable('Subcategory');
query.dropTable('Category');
query.dropTable('User');
query.dropTable('Measure');
query.dropTable('Venue');
}
};

View File

@@ -13,10 +13,15 @@ module.exports = function(sequelize, DataTypes) {
type: DataTypes.STRING,
allowNull: false
},
counts: {
measures: {
//A list of measureId's in the order they should be listed when entering data (first is most likely, last is least likely).
type: DataTypes.JSON,
allowNull: false
},
defaultPrice: {
type: DataTypes.DECIMAL(9,2),
allowNull: false
},
visible: {
type: DataTypes.BOOLEAN,
allowNull: false,

View File

@@ -10,21 +10,25 @@ module.exports = function(sequelize, DataTypes) {
autoIncrement: true
},
date: {
type: DataTypes.DATE,
type: DataTypes.DATEONLY,
allowNull: false
},
measure: {
type: DataTypes.JSONB,
quantity: {
type: DataTypes.DECIMAL(13,2),
allowNull: false
},
price: {
//GAAP standard is to use DECIMAL(13,4) for precision when dealing with money. 13 digits before the decimal, and 4 after it.
type: DataTypes.DECIMAL(13,4),
allowNull: false
}
}, {
freezeTableName: true, // Model tableName will be the same as the model name
classMethods: {
associate: function(models) {
//Sale.hasOne(models.Category, {as: 'category'});
//Sale.hasOne(models.Subcategory, {as: 'subcategory'});
Sale.belongsTo(models.Item, {as: 'item', foreignKey: {name: 'itemId', field: 'itemId'}});
Sale.belongsTo(models.Venue, {as: 'venue', foreignKey: {name: 'venueId', field: 'venueId'}});
Sale.belongsTo(models.Venue, {as: 'venue', foreignKey: {name: 'venueId', field: 'venueId'}});
Sale.belongsTo(models.Measure, {as: 'measure', foreignKey: {name: 'measureId', field: 'measureId'}});
}
}
});

View File

@@ -7,7 +7,8 @@
},
"dependencies": {
"bcrypt-nodejs": "^0.0.3",
"body-parser": "latest",
"bluebird": "^3.4.0",
"body-parser": "^1.15.1",
"connect-flash": "^0.1.1",
"cookie-parser": "~1.3.3",
"debug": "~2.1.1",

View File

@@ -1,16 +1,15 @@
<div id="aquaponics" class="page">
<div id="aquaponicText" style="position: relative; z-index: 2;">
<div><h1>Aquaponics</h1></div>
<p>In 2013, most farms in California, including ours, were affected by drought. Farming and kitchen operations require a lot of water. Our water comes exclusively from wells: we have no rivers, lakes, or reservoirs to tap into. We decided in 2013 to experiment with <b>aquaponics</b> as a method of increasing our water security and reducing our water usage. This benefits wildlife by leaving more water in our streams and ponds.</p>
<p>Aquaponics is a system of growing crops and fish in tandem. The water is recycled continuously and the fish fertilize the plants. It uses naturally occurring beneficial bacteria to keep the water clean and convert waste from the fish into nutrients for the plants. The plants, in turn, remove the excess nutrients that would otherwise harm the fish.</p>
<p>Aquaponics is not a new idea - it is mimicking nature. Modern advances in technology combined with increased water needs have made it economically feasible now.</p>
<p>Our test system, started in 2013, was successful and gave us valuable data which we used to build our first commercial system, operational in mid 2014. We are already transitioning our most water intensive growing into the aquaponics system, allowing the farm to continue to scale naturally with customer demand.</p>
<div style="margin: 0 auto; width:600px;"><img src='images/Aquaponic1_v1.jpg' class="shadow" style="width:580px; height:326px;" style="float: none; margin: 0;"/></div>
<p>
Wynne gives classes in aquaponics for kids ages 9 and up, and adults of all varieties. We also offer tours and consulting to help you avoid many of the expensive mistakes as you design your own aquaponic system. Tours are $30 for up to 3 people and $10 per person to a maximum of 6 people. To arrange for classes, tours, or consulting, please <a href="#!/visiting">call the farm <b>707.684.4146</b> or email</a>. If you need to contact Wynne directly (for technical questions) you may email <a href="mailto:wynne@petitteton.com">wynne@petitteton.com</a> or try calling <b>707.684.4148</b> if it is urgent.
</p>
<div><h1>Aquaponics</h1></div>
<p>In 2013, most farms in California, including ours, were affected by drought. Farming and kitchen operations require a lot of water. Our water comes exclusively from wells: we have no rivers, lakes, or reservoirs to tap into. We decided in 2013 to experiment with aquaponics as a method of increasing our water security and reducing our water usage. This benefits wildlife by leaving more water in our streams and ponds.</p>
<p><b>Aquaponics is a system of growing crops and fish in tandem.</b> The water is recycled continuously and the fish fertilize the plants. It uses naturally occurring beneficial bacteria to keep the water clean and convert waste from the fish into nutrients for the plants. The plants, in turn, remove the excess nutrients that would otherwise harm the fish.</p>
<p>Aquaponics is not a new idea - it is mimicking nature. Modern advances in technology combined with increased water needs have made it economically feasible now.</p>
<p>Our test system, started in 2013, was successful and gave us valuable data which we used to build our first commercial system, operational in mid 2014. We are already transitioning our most water intensive growing into the aquaponics system, allowing the farm to continue to scale naturally with customer demand.</p>
<div style="margin: 0 auto; width:600px;"><img src='images/Aquaponic1_v1.jpg' class="shadow" style="width:580px; height:326px;" style="float: none; margin: 0;"/></div>
<div style="margin: 0 auto; width: 600px; font-family: 'trebuchet ms', geneva; font-size: .9em; font-weight: 800; text-align: center;">For more aquaponic information, please see <a href="https://blog.petitteton.com/tag/aquaponics/" target="_blank">the aquaponic section of our blog.</a></div>
<p>
Wynne gives classes in aquaponics for kids ages 9 and up, and adults of all varieties. We also offer tours and consulting to help you avoid many of the expensive mistakes as you design your own aquaponic system. Tours are $30 for up to 3 people and $10 per person to a maximum of 6 people. To arrange for classes, tours, or consulting, please <a href="#!/visiting">call the farm <b>707.684.4146</b> or email</a>. If you need to contact Wynne directly (for technical questions) you may email <a href="mailto:wynne@petitteton.com">wynne@petitteton.com</a> or try calling <b>707.684.4148</b> if it is urgent.
</p>
</div>
</div>
<runonce>

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -14,7 +14,7 @@
<ul class="basicList" style="padding: 0; margin: 0;">
<li style="padding-top: 6px; text-indent: 0;"><a target="_blank" href="http://www.mcfarm.org/mendocino.html">Mendocino Farmers' Market</a> (May 1<sup>st</sup>-Oct 31<sup>st</sup>) Fridays, noon-2pm
<li style="padding-top: 6px; text-indent: 0;"><a target="_blank" href="http://www.mcfarm.org/boonville.html">Boonville Farmers' Market</a> (All Year)* Saturdays, 9-12:30pm
<li style="padding-top: 6px; text-indent: 0;"><a target="_blank" href="http://www.mcfarm.org/fort-bragg.html">Fort Bragg Farmers' Market</a> (Nov 1<sup>st</sup>-Apr 30<sup>th</sup>) Wednesdays, 3-6pm
<!--<li style="padding-top: 6px; text-indent: 0;"><a target="_blank" href="http://www.mcfarm.org/fort-bragg.html">Fort Bragg Farmers' Market</a> (Nov 1<sup>st</sup>-Apr 30<sup>th</sup>) Wednesdays, 3-6pm-->
<li style="padding-top: 6px; text-indent: 0;"><a target="_blank" href="http://www.agriculturalinstitute.org/clement-st/"> Clement Street Farmers' Market</a> (All Year) Sundays, 9am-2pm at the corner of Clement and 4th Ave in San Francisco
<li style="padding-top: 6px; text-indent: 0; font-size: 10px;">* We occasionally miss the Boonville market, but can normally be found at Petit Teton Farm, a few miles south-east on Hwy 128.
</ul>

View File

@@ -2,6 +2,39 @@
<h1>About Us</h1>
<h2>WELCOME TO PETIT TETON FARM</h2>
<p><img src="images/Us_NikkiSteve_v1.jpg" alt="" border="0" style="height: 290px; float: right; padding: 4px 0px 10px 10px;" align="left"/>
Hi, we're <b>Nikki</b> and <b>Steve</b>. In 2004, we bought a ranch in Mendocino County's Anderson Valley, 5 acres of which we developed into the Petit Teton Farm, named for a small mountain visible from the entryway. Prior to that, we lived on 27th Avenue off Lake Street in San Francisco for more than 15 years. As the farm has grown, and our family has become involved in the business, we all spend time in both places.</p>
<p>Our original mission was to provide fresh, organically grown, local produce and eggs from our farm to Mendocino County and San Francisco, just 100 miles away. When we realized we couldn't sell everything we grew, we built a commercial kitchen to extend the food's shelf life and increase its value to our customers. Now, each week we sell our farm-made fare, eggs, and produce at <a href="#!/markets">Farmers' Markets</a> in both San Francisco and Mendocino County.</p>
<p style="margin-top: 0px;">Before starting Petit Teton farm with his partner, Nikki, Steve spent 25 years as corporate counsel for Bank of America. He is a life-long Californian; born in Long Beach and grew up in Santa Barbara and San Jose. He graduated from San Jose State University with a BA in Political Science and from the University of San Diego with a JD. Steve passed the California Bar in 1977 and is still an active member. In addition to farming, he and Nikki love to hike in the Sierra Nevada.</p>
<p style="margin-top: 0px;">Nikki is a fine artist in paint, drawing and sculpture, with many exhibitions, awards and commissions on her resume. She attended the HS of Music &amp; Art in New York City where she was born and raised, and received a BFA from the RI School of Design and an MFA from the University of Michigan. For her farming is yet another art medium that includes not only the visual and tactile senses, but the oral, auditory, olfactory and intuitive ones as well. Creating a working farm and business out of a beautiful piece of land is a thrilling adventure, and she continues to be a fine artist in a multitude of mediums.</p>
<p>Nikki's son, <b>Cameron</b>, has been working with us since 2008. In the spring of 2012 her other son, <b>Wynne</b>, daughter-in-law, <b>Sarah</b>, and grandchildren, Kellie and Zoey, moved to the ranch to work with us. We are now a family farm.</p>
<p><img src="images/Us_Cam_v1.jpg" alt="" border="0" style="float: left; padding: 0px 10px 20px 0px;" align="left"/>
<b>Cam</b> has a background in finance, and is a member of the CFA Society of SF. He splits his time between the farm and the city. On farm he's involved in most aspects of the business: planning, planting, harvesting, pruning, water systems, landscaping, kitchen work, and all general back-breaking labor. Most Sundays he can be found at our farm booth at the <a href="#!/markets">Clement Street Farmers' Market</a>.
<p style="margin-top: 0px;">When he's not working on the farm business, Cameron continues to practice within the field of finance, in which he has background training. He received a BA in Asian Studies and Japanese from California State University, Sacramento in 2002, and went on to work as a Registered Client Service Representative with a team of Wealth Management brokers at UBS Financial Services, Inc. He received his Chartered Financial Analyst (CFA) designation in 2009, is an active member of the SF CFA Society, and continues today as an active portfolio manager for client accounts. Aside from an interest in farming and finance, Cameron pursues a long-term goal in the field of philanthropy, volunteering as the CF0 of the Petit Teton Foundation and on the Advisory Board for the Bay Area Financial Education Foundation (BAFE).</p>
<br/><br/></p>
<p><img src="images/Us_Sarah_v2.jpg" alt="" border="0" style="float: right; padding: 4px 0px 10px 10px; width: 185px;" align="right"/>
<b>Sarah</b> has an business degree and is our kitchen manager. She produces most of our <a href="#!/farm-made-fare">canned and prepared foods</a> and keeps track of them. She loves living in northern California and in the Anderson Valley for its small town feel. Always interested in baking, she's incorporated our home-grown produce into tasty pretzels and other baked goods, which are a big hit on market days during the winter months.</p>
<p style="margin-top: 0px;">Sarah is an emergency manager from Alaska. She is well educated, with an MBA under her belt, and has spent many years working in emergency preparedness and response. While today you will often find Sarah creating culinary delights, she also continues to stay active in emergency response and the community in general.</p>
<br/>
<p style="clear: left;"><img src="images/Us_Wynne_v2.jpg" alt="" border="0" style="float: left; padding: 4px 10px 10px 0px; width: 185px;" align="left"/>
<b>Wynne</b> has a software engineering background and uses his knowledge to improve farm efficiency. Recently he has delved into aquaponics in an effort to reduce our water use for growing food. We now have <a href="#!/aquaponics">aquaponic systems</a> that recirculate water between fish and plants. He also maintains the farm web site, and is building information systems to help us track our production.</p>
<p style="margin-top: 0px;">With a background in software engineering specializing in corporate and startup software development, Wynne is a rock the boat to see what happens type of person. On any given day you will find Wynne designing, prototyping, and debugging complex software, social, and mechanical engineering problems. Wynne holds an MBA and a Bachelors of Computer Science, in addition to more than a decade of experience in the software industry, running his own software development and consulting firm, and building a next generation application development framework currently weighing in at a half million lines of code.</p>
<br/>
<p style="clear: left;"><img src="images/Us_Cliff_v1.jpg" alt="" border="0" style="float: right; padding: 4px 0px 10px 10px; width: 140px;" align="right"/>
We are the luckiest farm family in the world to have <b>Cliff</b> as our farm infrastructure manager, house and kitchen builder, tool maven, and excavator. He is the best general contractor ever and in his previous life managed the building of many large commercial and civic buildings in Northern California. He has been working with us exclusively for the past 7-8 years and at this point we couldn't do business without him behind the scenes repairing all our mistakes. Although weve learned a lot from him over the years, we are still novices in comparison.
<br/><br/><br/></p>
<p style="clear: left;"><img src="images/Us_Juan_v1.jpg" alt="" border="0" style="float: left; padding: 4px 10px 10px 0px; width: 140px;" align="left"/>
<b>Juan</b> is originally from the small town of La Laguneta in Michoacan Mexico. He has long experience in farming - over ten years as a gardener, harvesting organic grapes, doing maintenance and irrigation and more in a small Philo vineyard. Before coming to the US he also raised cows in the family business in Mexico. During his free time he enjoys the challenge of working on pretty much anything related to repairing and restoring vehicles, and on the upkeep of a year-round garden at his home with his wife. The man doesn't waste a minute and is always on the go. He has become an essential part of all aspects of our farm operation.</p>
<br/><br/><br/>
<!-- OLD way (split into two parts)
<p><img src="images/Us_NikkiSteve_v1.jpg" alt="" border="0" style="height: 290px; float: right; padding: 4px 0px 10px 10px;" align="left"/>
Hi, we're <b>Nikki</b> and <b>Steve</b>. In 2004, we bought a ranch in Mendocino County's Anderson Valley, 5 acres of which we developed into the Petit Teton Farm, named for a small mountain visible from the entryway. Prior to that, we lived on 27th Avenue off Lake Street in San Francisco for more than 15 years. As the farm has grown, and our family has become involved in the business, we all spend time in both places.</p>
<p>Our original mission was to provide fresh, organically grown, local produce and eggs from our farm to Mendocino County and San Francisco, just 100 miles away. When we realized we couldn't sell everything we grew, we built a commercial kitchen to extend the food's shelf life and increase its value to our customers. Now, each week we sell our farm-made fare, eggs, and produce at <a href="#!/markets">Farmers' Markets</a> in both San Francisco and Mendocino County.</p>
@@ -40,6 +73,8 @@
<p style="margin-top: 0px;">Sarah is an emergency manager from Alaska. She is well educated, with an MBA under her belt, and has spent many years working in emergency preparedness and response. While today you will often find Sarah creating culinary delights, she also continues to stay active in emergency response and the community in general.</p>
<h4 style="margin-bottom: 6px;">Wynne Crisman</h4>
<p style="margin-top: 0px;">With a background in software engineering specializing in corporate and startup software development, Wynne is a rock the boat to see what happens type of person. On any given day you will find Wynne designing, prototyping, and debugging complex software, social, and mechanical engineering problems. Wynne holds an MBA and a Bachelors of Computer Science, in addition to more than a decade of experience in the software industry, running his own software development and consulting firm, and building a next generation application development framework currently weighing in at a half million lines of code.</p>
-->
<!--<h4 style="margin-bottom: 6px;">Cliff McClure</h4>
<p style="margin-top: 0px;"></p>
<h4 style="margin-bottom: 6px;">Juan Cacho</h4>