aboutsummaryrefslogtreecommitdiffstats
path: root/timetask
AgeCommit message (Collapse)Author
2017-03-12GenerateWeeklyTimesheet: Auto-fill the date with all days in the weekTeddy Wing
Get Monday's date from the current week using the When library (which provides natural language date parsing, making it super easy to get a time object for Monday). Then when creating the `TimeEntry`ies for the generator, fill in Monday–Friday's dates in the output.
2017-03-12Add GenerateWeeklyTimesheet()Teddy Wing
A function to generate a weekly time sheet. Add a new `defaults` key to the config.yml file. Looks like this: defaults: client: project: module: task: work_type: time: billable: This will be used to fill in default values when a timesheet is generated.
2017-03-12TimeEntry.UnmarshalYAML: Don't error if date empty stringTeddy Wing
The date is allowed to be empty in the config defaults hash. Don't error if it is.
2017-03-12SubmitTimeEntries: Add required paramsTeddy Wing
These tell the Time Task form endpoint that we're submitting a multiple-time submission request.
2017-03-12Change all `uint` types to `int`Teddy Wing
Because `strings.Itoa` is so much easier to call than `strconv.ParseUint`, and I needed to parse ints into strings to build the URL params in `buildSubmissionParams` (17f4ecc63615e3f3bef21a80f15e7c7b0e0cffa1).
2017-03-12http.go: Add `buildSubmissionParams` functionTeddy Wing
Function that takes a list of `TimeEntry`ies and builds the necessary URL params for submission to the Time Task form endpoint.
2017-03-12fields.go: Get rid of unused `thingsByName` functionTeddy Wing
Not relevant. See 89f766854443a6f7ae20c330547083fd0e075ba9.
2017-03-12fields.go: Add methods that allow us to extract objects by nameTeddy Wing
We want to be able to get Client, Project, etc. objects given their name. These functions will look through the fields or objects containing a list of the thing looked for and return if if its name matches the search string. Originally had the idea to generalise the body of the function, but had trouble making the types generic. Still on the table for later if we want to deduplicate the code. For now I'm leaving in the repetition because it works and I don't care with this project.
2017-03-12fields.go: Get rid of `IDName`Teddy Wing
Embedding this struct prevented us from correctly unmarshalling data into them. This is because they need to be created like: Client{IDName{ID: , Name: ,}} The fields can't be added in directly. Save ourselves the headache and just manually repeat the fields. So that importing works right.
2017-03-12TimeEntry: Add missing Module fieldTeddy Wing
Forgot to add this field originally. Do the same as when we added the `Time` field.
2017-03-12time_entry.go: Properly unmarshal Time fieldTeddy Wing
Fix 7a8db5312bbb43c986fbae7aa14960e22080b03b to ensure that the `Time` field actually gets unmarshalled into `TimeEntry` structs.
2017-03-12Make fields named structsTeddy Wing
We'll be needing to refer to these fields as named types, so create types for them and reference them in the config object.
2017-03-12time_entry.go: Add missing `Time` fieldTeddy Wing
Include billable hours field.
2017-03-12Parse timesheet filesTeddy Wing
Expect a timesheet file as the last argument to the program. Parse the contents into `TimeEntry` objects. `TimeEntry`ies will then be able to be POSTed to Time Task to submit times. The time entries input file is a YAML document in this format: - client: A client project: A project module: A module task: A task work_type: type date: 2017-03-06 time: 7 billable: true description: It contains an array where each element is a time entry. Had a lot of trouble parsing the date into a `time.Time`. Finally realised that my first and biggest problem was somehow I was importing `yaml.v1` instead of `yaml.v2`, and thus my `UnmarshalYAML` function was never getting called. Wanted a way to get the time as a string and parse it myself into a time. At first tried using an `UnmarshalText` function: type Time time.Time func (t *Time) UnmarshalText(text []byte) error { parsed, err := time.Parse("2006-01-02", string(text)) if err == nil { *t = Time(parsed) } return err } But in order to do that I had to make a type alias to `time.Time`. Doing so was not ideal, because then I'd have to convert my `Time` into a `time.Time` any time I wanted to use it for real. Ended up going with a suggestion from here: https://mlafeldt.github.io/blog/decoding-yaml-in-go/ Creating an auxiliary struct in `UnmarshalYAML` to unmarshal the date into a string and then parse it myself as a date. I don't really like it because it's a lot of ceremony just to parse one type myself, but can't come up with a better solution right now so there you have it.
2017-03-11TestLogin: Replace af83-specific textTeddy Wing
2017-03-11TestLogin: Do actual test checksTeddy Wing
Verify errors and check the response body to ensure successful login.
2017-03-11Get login workingTeddy Wing
Fill in the `Login` function to actually log in to Time Task. Pass credentials in via test command flags. Referenced https://gist.github.com/varver/f327ef9087ebf76aa4c4 for the cookie setup.
2017-03-11Initial commit. Test HTTP request.Teddy Wing
Make a sample GET request using `net/http`.