Пример #1
0
func importaccount(c appengine.Context, w http.ResponseWriter, r *http.Request) {
	usr := user.Current(c)
	if usr == nil {
		w.Write([]byte("Not logged in"))
	}
	account := models.GetAccount(c, usr.Email)

	r.ParseForm()

	//file, header, err
	file, _, err := r.FormFile("importfile")
	if err != nil {
		w.Write([]byte(err.Error()))
		return
	}

	reset := r.Form.Get("resetAccount") == "on"

	if reset {
		account.Cellars = map[string]*models.Cellar{}
		account.CellarsByID = map[int]*models.Cellar{}
	}
	csvReader := csv.NewReader(file)
	csvReader.FieldsPerRecord = -1
	err = nil

	var currentCellar *models.Cellar
	var currentBeer *models.Beer

	for err == nil {
		line, err2 := csvReader.Read()
		err = err2
		if len(line) > 0 {
			switch {
			case "CELLAR" == line[0]:
				{
					w.Write([]byte("Got Cellar"))
					cellarName := line[1]
					currentCellar = account.Cellars[cellarName]
					if currentCellar == nil {
						currentCellar = &models.Cellar{
							ID:         account.NextCellarID,
							NextBeerID: 0,
							Name:       cellarName,
							Beers:      map[string]*models.Beer{},
							BeersByID:  map[int]*models.Beer{},
						}
						account.Cellars[cellarName] = currentCellar
						account.CellarsByID[account.NextCellarID] = currentCellar
						account.NextCellarID++
					}
					break
				}
			case "BEER" == line[0]:
				{
					w.Write([]byte("Got Beer"))
					ubid, err := strconv.Atoi(line[1])
					if err != nil {
						w.Write([]byte(err.Error()))
						return
					}
					if ubid < 0 {
						ubid, err = models.GetAndIncrementUniversalBeerID(c)
						if err != nil {
							w.Write([]byte(err.Error()))
							return
						}
					}
					beerName := line[2]
					quantity, err := strconv.Atoi(line[3])
					if err != nil {
						w.Write([]byte(err.Error()))
						return
					}
					notes := line[4]
					brewed := models.ParseDate(line[5])
					added := models.ParseDate(line[6])
					currentBeer = currentCellar.Beers[beerName]
					if currentBeer == nil {
						currentBeer = &models.Beer{
							UBID:          ubid,
							ID:            currentCellar.NextBeerID,
							Name:          beerName,
							Notes:         notes,
							Brewed:        brewed,
							Added:         added,
							Quantity:      quantity,
							NextTastingID: 0,
							TastingsByID:  map[int]*models.Tasting{},
						}
						currentCellar.Beers[beerName] = currentBeer
						currentCellar.BeersByID[currentCellar.NextBeerID] = currentBeer
						currentCellar.NextBeerID++
					}
					break
				}
			case "TASTING" == line[0]:
				{
					w.Write([]byte("Got Tasting"))
					rating, err := strconv.Atoi(line[1])
					if err != nil {
						w.Write([]byte(err.Error()))
						return
					}
					notes := line[2]
					tasted := models.ParseDate(line[3])
					var currentTasting *models.Tasting
					for _, tasting := range currentBeer.TastingsByID {
						if tasting.Rating == rating && tasting.Notes == notes && tasting.Date.ToString() == tasted.ToString() {
							currentTasting = tasting
							break
						}
					}
					if currentTasting == nil {
						currentTasting = &models.Tasting{
							ID:     currentBeer.NextTastingID,
							Rating: rating,
							Notes:  notes,
							Date:   tasted,
						}
						currentBeer.TastingsByID[currentBeer.NextTastingID] = currentTasting
						currentBeer.NextTastingID++
					}
					break
				}
			}
		}
	}

	if err != io.EOF {
		w.Write([]byte(err.Error()))
		return
	}

	models.SaveAccount(c, account)
}
Пример #2
0
func handleNewBeerRequest(c appengine.Context, w http.ResponseWriter, r *http.Request) {

	cellarID, err := strconv.Atoi(r.PostFormValue("cellarID"))
	if err != nil {
		writeError(w, err)
		return
	}

	quantity, err := strconv.Atoi(r.PostFormValue("quantity"))
	if err != nil {
		writeError(w, err)
		return
	}

	name := r.PostFormValue("name")
	if name == "" {
		writeError(w, errors.New("No beer supplied"))
		return
	}

	notes := r.PostFormValue("notes")

	brewed := r.PostFormValue("brewed")
	var brewDate *models.Date
	if brewed == "" {
		brewDate = models.Now()
	} else {
		brewDate = models.ParseDate(brewed)
	}

	added := r.PostFormValue("added")
	var addedDate *models.Date
	if added == "" {
		addedDate = models.Now()
	} else {
		addedDate = models.ParseDate(added)
	}

	account := getAccount(c)
	if account == nil {
		writeError(w, errors.New("no account"))
		return
	}

	cellar := account.CellarsByID[cellarID]
	if cellar == nil {
		writeError(w, errors.New("cellar not found"))
		return
	}

	ubid, err := models.GetAndIncrementUniversalBeerID(c)
	if err != nil {
		writeError(w, err)
		return
	}

	beer := &models.Beer{
		UBID:          ubid,
		ID:            cellar.NextBeerID,
		Name:          name,
		Notes:         notes,
		Brewed:        brewDate,
		Added:         addedDate,
		Quantity:      quantity,
		NextTastingID: 0,
		TastingsByID:  map[int]*models.Tasting{},
	}

	cellar.NextBeerID++

	cellar.Beers[beer.Name] = beer
	cellar.BeersByID[beer.ID] = beer

	err = models.SaveAccount(c, account)
	if err != nil {
		writeError(w, err)
		return
	}

	writeSuccess(w, simpleBeer{
		ID:            beer.ID,
		Name:          beer.Name,
		AverageRating: 0,
		Quantity:      quantity,
		Notes:         beer.Notes,
		Brewed:        beer.Brewed.ToString(),
		Added:         beer.Added.ToString(),
		Age:           beer.GetAgeString(),
	})
}