Up Mt. Diablo

Last weekend we had a break in the rain and decided to get out of the house.  So we loaded up in the van and drove up Mt. Diablo (we've never been up before).  And then hiked around the top.

From the observation deck, which appears to be almost brand new.  The view is pretty spectacular, especially when everything is green.

I let Heather use my binoculars and she thought it was pretty great to look at anything and everything through them--even if it was only 3 feet away.

Out hiking the summit-loop trail:

Corinne thought climbing rocks and walking the paths was pretty awesome, but that wasn't going to be feasible once we got on the actual trail around the summit.  She wasn't enthused about the backpack at first, but once we got moving she was fairly pleased.

It was nice to get out and about, even if it took almost an hour to get up the mountain.  There was a line at the entrance gate that was moving incredibly slowly.  And then while we were waiting an ambulance and fire truck came up and passed us.  I'm sure taking the firetruck up the mountain with all the switchbacks and narrow lanes must have been fun.  I'm not sure what the correct protocol would have been if you had met the firetruck while coming down as the firetruck was coming up on the wrong side while passing all of the cars stopped waiting for the gate.  There wasn't room to go anywhere except in reverse.

The firetruck came down shortly thereafter, but we never saw the ambulance again.  So it must have gone down the northern entrance.

Django Form Label for Many-to-Many with Extra Fields

I'm working on a Django application at work that has several Many-to-Many relationships that have extra fields attached to them. Setting this up using the "through" parameter on the field definition is described in the Django documentation.

My trouble came in when it came time to render this information out to the user in a form so they could update the extra fields.  From the user's perspective the relationship can't be changed, but the extra fields could be.

Extending Django's example usage about band membership, if the user were viewing the information for "The Beatles" and including a formset for all band members the form would normally render something like this:

Group Name: The Beatles
Members:
    Group: The Beatles
    Person: Ringo Starr
    Date Joined: 14 August 1962
    -
    Group: The Beatles
    Person: John Lennon
    Date Joined: 01 August 1960
    -
    [etc.]

But this is a little obtuse if the purpose of the form is to allow the user to edit the "Date Joined" value for each band member.  We can whittle the form down by telling the formset to only render the "Date Joined" field [by passing fields=('date_joined',) to modelformset_factory], but then we get this:

Group Name: The Beatles
Members:
    Date Joined: 14 August 1962
    -
    Date Joined: 01 August 1960
    -
    [etc.]

Now we can't tell to which person each date applies.

Adjusting the form so that the label "Date Joined" was instead the appropriate band members name seems like such a simple thing to change.  But I didn't want to hand-write the form as it was already being automatically built and rendered for me using using modelformset_factory and Crispy-Forms.

It took me most of a day to figure it out and in the end it was pretty simple.  I only need to implement a custom Form that overrides the constructor and sets the label using the object instance before it gets thrown away:

class MembershipForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MembershipForm, self).__init__(*args, **kwargs)
        if kwargs['instance'] and kwargs['instance'].person:
            self.fields['date_joined'].label = kwargs['instance'].person.name
        else:
            self.fields['date_joined'].label = 'No Person'
    class Meta:
        model = Membership
        fields = ['date_joined']

And now our output looks something like:

Group Name: The Beatles
Members:
    Ringo Starr: 14 August 1962
    -
    John Lennon: 01 August 1960
    -
    [etc.]

Since it took me most of a day to figure this out, and I couldn't find anything specifically addressing this on the Internet, I wrote this up so hopefully the next person (or me in the future once I've forgotten this) will have an easier time figuring it out.

Christmas 2016

Christmas was quiet at home this year.

We got a Christmas tree right after Thanksgiving.  We opted out of the cut-our-own route this year.  The trees haven't been in good shape due to the drought, it's a long drive, and it doesn't save any money.  So we just grabbed one from the hardware store.

We wanted another Grand Fir, like we had last year, but no one seemed to have them.  So we ended up with a Nordmann Fir.  It seemed to hold its needles well, but it has no smell at all, and the needles have an almost plastic-y appearance.  We're going to try for the Grand Fir in the future (they apparently start stocking them a few weeks after Thanksgiving).

I added some berry-like lights to the decorations this year.  I thought they'd look neat hanging from the trellis / wisteria.  The effect wasn't quite what I had hoped, but I think I can re-work them next time around to have a better outcome.  The picture overexposes the lights hiding their color, so they're more colorful looking in real life.

On Christmas Eve we got the girls to bed and awaited Santa's arrival.

To discourage Heather from diving right in to the living room in the morning Jess set up streamers across the doorway:

Then it was to bed for the night....or so we thought.  At about 11:30 Heather got out of bed and came in to our room trying to tell us something, but refusing to open her mouth.  She then ran into the bathroom (thankfully) to throw up.  Once that was out of her system, she started freaking out about the streamers.  She was apparently interpreting them as locking us in or something.  We got her back to bed....and then Corinne woke up.  And around 4 she seemed to decide she was done sleeping.  And finally a little before 7 Heather got up, so we might as well all get up...

Surely Corinne doesn't have the cognitive capability to have been anticipating getting up Christmas morning, but she was definitely feeding off of Heather's energy throughout Christmas Eve day.  They were both completely loony.

Anyway, up we got, and much excitement was had.  But first with the requisite anticipation-building pictures:

Corinne ignored the shiny gifts and the colorful "Tote-a-fort" and bee-lined straight for the bowl of M&Ms on the desk (with lurking alligator) and starting shoveling them into her mouth (the kid is a chocolate fiend):

Heather, however, knows the routine and went for her stocking:

Gifts were opened, breakfast casserole was eaten, naps were taken, fun was had by all.

Corinne loves the fort:

Heather helps me open a gift (I think it's Funny Bones!):

Jess got a new jewelry box:

The brain flakes are lots of fun:

Heather, of course, wanted to do some science and try out the first project from The Magic School Bus Science Club (12-month subscription service).  We built a model lung (balloon), chest cavity (plastic bottle), and diaphragm (plastic wrap).  It actually works too.  Pulling the plastic wrap will inflate the balloon.  This picture is Heather recording her observations about the experiment.

A nice ham dinner was had later on in the day with fresh rolls, of course, and many dessert options.  I had been having waves of mild nausea throughout the day, but my stomach seemed to settle down by dinner and I was able to enjoy the feast.

Corinne was thoroughly worn out by the day.  She napped twice, so we thought she'd be up later than usual, but at about 7pm she dragged a pillow up to me, climbed up in my lap, set the pillow on my legs, folded in half on to the pillow, and fell asleep.