Compare commits

...

10 commits

Author SHA1 Message Date
3bbd987e35 usethesource: Add link to offer upload 2024-07-30 13:03:48 +10:00
54ae2c7b06 usethesource: Add admin interface 2024-07-29 23:44:40 +10:00
b39fbaa402 usethesource: Add missing template 2024-07-29 23:33:58 +10:00
770f4f6c26 usethesource: Add prototype "upload offer for source" 2024-07-29 23:29:25 +10:00
a2f38653fb
Fix trailing whitespace and missing end-of-file newline 2024-07-22 18:39:05 +10:00
c5289f39bb
Fix flake8 warnings 2024-07-22 18:39:00 +10:00
1a5441ba75
Fix tests
These were failing due to pytest defaulting to `DEBUG = False` (and then getting
`ValueError: Missing staticfiles manifest entry for ...`).
2024-07-22 16:56:25 +10:00
6636119200
Use {% static %} for home page video subtitles 2024-07-22 10:37:56 +10:00
02efd52c48
Update README - overview, licenses and Ansible 2024-07-22 10:32:41 +10:00
5479785cc1
Add default line-height to <li> elements
They currently look too tight compared with paragraph text.
2024-07-22 10:13:50 +10:00
73 changed files with 379 additions and 223 deletions

View file

@ -1,5 +1,9 @@
# Software Freedom Conservancy website
This is a Python/[Django](https://www.djangoproject.com/)-based website that
runs [sfconservancy.org](https://sfconservancy.org).
## Contributing
The canonical location for this repository is [on Conservancys
@ -9,9 +13,9 @@ Kallithea instance](https://k.sfconservancy.org/website).
## License
The software included herein, such as the Python source files, are generally
licensed [AGPLv3](AGPLv3)-or-later. The Javascript is a hodgepodge of
licensing, but all of it is compatible with [AGPLv3](AGPLv3)-or-later. See
the notices at the top of each Javascript file for licensing details.
licensed [AGPLv3](AGPLv3)-or-later. JavaScript source is generally
[GPLv3](GPLv3)-or-later. See the notices at the top of each Javascript file for
specific licensing details.
The content and text (such as the HTML files) is currently
[CC-BY-SA-3.0](CC-By-SA-3.0).
@ -20,7 +24,7 @@ The content and text (such as the HTML files) is currently
## Server configuration
Conservancy's webserver runs on a standard Debian installation. For
configuration requirements, see `deploy/ansible/install.yml`.
configuration requirements, see `deploy/install.yml`.
## CDN

6
bin/test Executable file
View file

@ -0,0 +1,6 @@
#!/usr/bin/env sh
set -e # Abort on failure
set -x
python3 -m pytest

View file

@ -17,5 +17,3 @@ class EntryAdmin(admin.ModelAdmin):
search_fields = ['headline', 'summary', 'body']
prepopulated_fields = {'slug': ("headline",)}
filter_horizontal = ('tags',)

View file

@ -72,11 +72,11 @@ class Entry(models.Model, bsoup.SoupModelMixin):
# Ping Technorati
j = xmlrpc.client.Server('http://rpc.technorati.com/rpc/ping')
reply = j.weblogUpdates.ping(blog_name, blog_url)
j.weblogUpdates.ping(blog_name, blog_url)
# Ping Google Blog Search
j = xmlrpc.client.Server('http://blogsearch.google.com/ping/RPC2')
reply = j.weblogUpdates.ping(blog_name, blog_url, post_url)
j.weblogUpdates.ping(blog_name, blog_url, post_url)
# Call any superclass's method
super().save()

View file

@ -3,7 +3,6 @@ from functools import reduce
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView
from django.views.generic.dates import (
DateDetailView,
DayArchiveView,
@ -12,7 +11,7 @@ from django.views.generic.dates import (
)
from ..staff.models import Person
from .models import Entry, EntryTag
from .models import EntryTag
def OR_filter(field_name, objs):
@ -124,7 +123,7 @@ class BlogYearArchiveView(YearArchiveView):
make_object_list = True
allow_future = True
extra_context = {}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(self.extra_context)
@ -133,7 +132,7 @@ class BlogYearArchiveView(YearArchiveView):
class BlogMonthArchiveView(MonthArchiveView):
allow_future = True
extra_context = {}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(self.extra_context)
@ -142,7 +141,7 @@ class BlogMonthArchiveView(MonthArchiveView):
class BlogDayArchiveView(DayArchiveView):
allow_future = True
extra_context = {}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(self.extra_context)
@ -151,7 +150,7 @@ class BlogDayArchiveView(DayArchiveView):
class BlogDateDetailView(DateDetailView):
allow_future = True
extra_context = {}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update(self.extra_context)

View file

@ -117,7 +117,7 @@ Open Source Award in 2012</a>, in recognition for his lifelong policy work on
copyleft licensing. Kuhn has <a href="http://ebb.org/bkuhn/blog/">a
blog</a> and co-hosts
the audcast, <a href="http://faif.us/"><cite>Free as in Freedom</cite></a>.</p>
<h2 id="allison">Dr. Allison Randal - Chair of the Board</h2>
<p> Over the course of multiple decades as a free software developer,

View file

@ -35,7 +35,7 @@ Texas Linux Fest, LibrePlanet, CopyCamp Toronto, FOSSLC's Summercamp,
CopyleftConf, and the Open Video Conference.</p>
<h2 id="tracy">Tracy Homer - Operations Manager</h2>
<p>Tracy acts as Operations Manager at Software Freedom Conservancy.
<p>Tracy acts as Operations Manager at Software Freedom Conservancy.
Bringing her super-skills of organization and love of bureaucracy,
she helps things run at SFC smoothly behind the scenes.
Tracy also serves on the board of her local hackerspace, an organization

View file

@ -64,7 +64,7 @@ launched</a> the <cite>GPL
Compliance Project for Linux Developers</cite>, which handles compliance and
enforcement activities on behalf of more than a dozen Linux copyright
holders.</p>
<p>The GPL Compliance Project for Linux Developers is comprised of copyright
holders in the kernel, Linux, who have contributed to Linux under its
license, <a href="http://www.gnu.org/licenses/gpl-2.0.html">the

View file

@ -78,7 +78,7 @@
<p>Conservancy has had substantial success in leveraging more device freedom
in other subindustries through GPL compliance. In 2009, Conservancy, with
co-Plaintiff Erik Andersen, sued fourteen defendants in federal court under
copyright claims on behalf of its BusyBox member project. Conservancy
copyright claims on behalf of its BusyBox member project. Conservancy
achieved compliance for the BusyBox project in all fourteen
cases. Most notably, the GPL-compliant source release obtained in the
lawsuit for certain Samsung televisions provided the basis for

View file

@ -20,7 +20,7 @@ and improvement of the released software for users.</p>
success found with OpenWrt</a> <em>only by</em> a substantial
effort <strong>after</strong> enforcement occurs to turn the compliant
source release into a viable alternative firmware for the platform.</p>
<p>Conservancy has seen non-compliant Linux-based firmwares on refrigerators,
baby monitors, virtual assistants, soundbars, doorbells, home security
cameras, police body cameras, cars, AV receivers, and televisions. We

View file

@ -29,13 +29,13 @@
<!--- FIXME: bkuhn is rewriting this blog post fresh the weekend of --
2020-07-18 so we need not link to ebb.org anymore when we roll out
these changes ... which never happened, still need to do that -->
these changes ... which never happened, still need to do that -->
<p>If you think you've found a GPL violation, we encourage you to
read <a href="http://ebb.org/bkuhn/blog/2009/11/08/gpl-enforcement.html">this
personal blog post by our Policy Fellow, Bradley M. Kuhn</a>, about good
practices in discovering and reporting GPL violations.</p>
<h2 id="sustain">Donate to Sustain This Work</h2>
<p>Finally, Conservancy welcomes <a href="#donate-box"

View file

@ -130,7 +130,7 @@ full press kit, with substantial additional information and resources for
<li><a href="/docs/software-freedom-conservancy-v-vizio-complaint-2021-10-19.pdf">The
legal complaint is available</a>.</li>
</ul>
<h3>MEDIA CONTACT</h3>

View file

@ -29,12 +29,12 @@
much help as possible to comply with copyleft, so we did.</p>
<p>We've worked for years to help VMware comply with the GPL, but they
refuse. Negotiations broke down for the last time when they insisted on an
refuse. Negotiations broke down for the last time when they insisted on an
NDA just to discuss settlement terms!</p>
<p>Christoph is among the most active developers of Linux. As of Feburary
19, 2015, Christoph has contributed 279,653 lines of code to the Linux kernel,
and ranks 20th among the 1,340 developers involved in the latest 3.19 kernel
<p>Christoph is among the most active developers of Linux. As of Feburary
19, 2015, Christoph has contributed 279,653 lines of code to the Linux kernel,
and ranks 20th among the 1,340 developers involved in the latest 3.19 kernel
release. Christoph also
ranks 4th among those who have reviewed third-party source code, tirelessly
corrected and commented on other developers' contributions. Christoph
@ -97,8 +97,8 @@ judges think. (Check out our <a href="/copyleft-compliance/vmware-lawsuit-faq.h
information</a>.)</p>
<p>Help us pay for this expensive lawsuit and to generally defend software
freedom and the GPL. Help us show the world that copyleft matters. We are excited
to announce that we already reached an anonymous match for this campaign, where every dollar donated
freedom and the GPL. Help us show the world that copyleft matters. We are excited
to announce that we already reached an anonymous match for this campaign, where every dollar donated
was matched up to $50,000. However, that $100,000 is just an initial step
and there is so much GPL enforcement work to do. So, please
donate now: by becoming <a href="/sustainer/">a Conservancy Sustainer</a> or
@ -119,7 +119,7 @@ information</a>.)</p>
type="video/webm; codecs=&#34;vp8, vorbis&#34;"
/>
</video>
</p>

View file

@ -112,7 +112,7 @@ Interest; all encourage you to <a href="#donate-box" class="donate-now">donate a
<p>The project that Conservancy proposes will take a modest step
forward in creating a better solution for everyone.
forward in creating a better solution for everyone.
<a href="#quotes">Many NPO leaders and academics agree</a> with Conservancy about the
immediate need for work to begin on this
effort. <a id="endorsements"

View file

@ -28,13 +28,13 @@
<p>“FOSS” stands for free and open-source software that allows for software freedom. “Software freedom” means the freedom of a user to run, study, (re)distribute, and (re)install (modified) versions of a piece of software. More generally, it is the idea that we are entitled to rights when using software and there should be equal protections for privacy and redistribution. The rights should treat everyone equally: big businesses and individual consumers and users alike.</p>
<h3 id="">Q: I thought FOSS allowed companies to simply take software from the commons and put it into their products whenever they wanted? Isnt that the whole point of FOSS—for companies to get components for their products and lower their cost of production?</h3>
<p>While that is the main advantage that big corporations get from FOSS, it was never the primary impetus behind FOSS. Particularly through special licensing terms like the GPL, this licensing approach creates an egalitarian community of users, developers, and consumers. When functioning correctly, each individual and organization that participates in FOSS stands on equal footing with everyone else. Licenses like the GPL have rules to assure everyone's rights in that ecosystem are treated with equal respect and reverence. This is why compliance with these rules is important and we must stand up against companies who refuse to comply. </p>
<h3 id="">Q: But, I'm not a software developer. Why should I care at all that Vizio wont let me modify and reinstall GPLd components in its SmartCast system?</h3>
<p>Right-to-repair software is essential for everyone, even if you don't know how to make the repairs yourself. Once upon a time, we had lots of local vendors that could repair and fix TVs when they broke. Thats because TVs were once analog hardware devices that could be taken apart and understood merely by inspection from someone with the sufficient knowledge. TVs today are simply a little computer attached to a large display. As such, the most important part that needs repairs is usually when the software malfunctions, has bugs, or otherwise needs upgrades and changes. The GPL was specifically designed to assure such fixes could be done, and that consumers (or agents those consumers hire on the open market) can make such repairs and changes. </p>
<h3 id="">Q: Alright, that makes sense, but Im happy with Vizios SmartCast right now. What difference does it make to me if Vizio wont give me the rights under the GPL?</h3>
<p>Time and time again, companies stop supporting the software build for the device long before the computer inside the device fails. In other words, these devices are built for planned premature obsolescence. </p>
@ -42,13 +42,13 @@
<p>By refusing to comply with the pro-consumer terms of the GPL, Vizio has the power to disable your TV at any time it wants, over your internet connection, without your knowledge or consent. If Vizio complied with the GPL, all would not be lost in this scenario: volunteers and third-party entities could take GPLd software as a basis for a replacement for SmartCast. Without these rights, consumers are essentially forced to purchase new devices when they could be repaired.</p>
<h3 id="">Q: Creation of a replacement for SmartCast seems far-fetched to me. After all, most of the software in SmartCast is not actually GPLd, only a portion of the components and programs are GPLd. How will Vizio's compliance with the GPL actually lead to an alternative firmware?</h3>
<p>Years ago, people said the very same thing about wireless routers, which had only partially GPL'd firmwares. However, thanks to actions to enforce the GPL in the wireless router market, the OpenWrt project was born! That project is now the premiere replacement software for wireless routers from almost every major manufacturer on the market. There is now healthy competition and even occasional cooperation between a hobbyist and community-led firmware project and the wireless router manufacturers. We believe the same can happen for TVs, but the first step is assuring the entire TV market complies with the GPL.</p>
<h3 id="">Q: What indications do you have that compliance with the GPL will be a catalyst for alternative firmwares?</h3>
<p>Beyond the OpenWrt example, Software Freedom Conservancy sued 14 defendants for GPL violations in 2009, including Samsung for its 2009-era TV models. Thanks to the source release that was achieved through the settlement of that lawsuit, a community-led SamyGo project was created for that era of TVs. (source)</p>
<h3 id="">Q: Who is the plaintiff in the lawsuit?</h3>
<p>Software Freedom Conservancy is the plaintiff in this case. The organization is filing as a third-party beneficiary, as the purchaser of a product which has copylefted code on it. A consumer of a product such as this has the right to access the source code so that it can be modified, studied, and redistributed (under the appropriate license conditions).</p>
@ -60,7 +60,7 @@
<h3 id="">Q: What type of case is this? How does it compare to previous litigation by Software Freedom Conservancy regarding the GPL?</h3>
<p>Previously, Software Freedom Conservancy filed as a copyright holder in federal court, or coordinated or funded litigation by other copyright holders in copyright cases in the U.S. and Germany. This is an example of how, historically, GPL litigation has focused on the rights of the developers. However, the rights assured by the GPL are actually not intended primarily for the original developers, but rather for people who purchase products that contain GPLd software. That is what makes this litigation unique and historic in terms of defending consumer rights. It is the first case that focuses on the rights of individual consumers as third-party beneficiaries of the GPL.</p>
<h3 id="">Q: Why are you filing a third-party beneficiary claim instead of a copyright claim?</h3>
<p>For too long, GPL enforcement has focused only on the rights of developers, who are often not the ones impacted by the technology in question. Some of those same developers even have lucrative jobs working for the various companies that violate the GPL. The GPL was designed to put the rights of hobbyists, individual developers, consumers, small companies, and nonprofit organizations on equal footing with big companies. With the advent of more contributions to GPLd software coming from for-profit multinational corporations and fewer from individuals, the rights of these other parties are often given second-class billing. The third-party beneficiary claim prioritizes the consumers, who are the users and the most important beneficiaries of the rights under GPL.</p>
@ -68,7 +68,7 @@
<h3 id="">Q: Are you saying the rights of developers under the GPL are not important?</h3>
<p>Not at all! Most would agree that individual developers care deeply about the software freedom of users. They are the artists who create the amazing FOSS on which all of us rely. However, as Francis Ford Coppola once said (paraphrased), “to understand who holds the power in any culture, look not to the artists but who employs the artists”—a quote which suits this situation well. Large multinational corporations have co-opted FOSS for their own bottom lines. While many developers privately cheer Software Freedom Conservancys efforts and donate money to this cause, they fear the power that their employers exert and have asked Software Freedom Conservancy to fight for the software freedom of users.</p>
<h3 id="">Q: Why is this important for the future of developers?</h3>
<p>The next generation of developers comes from the users of today. The golden age of FOSS that the industry now enjoys came to fruition from the counterculture created by FOSS activists in the 1990s and early 2000s. During this time, Linux and other GPLd software was considered just a curiosity (and was even accused of being anti-American). Nevertheless, the rights assured by the GPL ultimately led to a new generation of software developers learning how to build Linux and all the amazingly useful FOSS around it. To recruit a diverse group of the next generation of enthusiastic developers, we must ensure that the rights under GPL are available to every single individual, consumer and hobbyist around the globe. That is what this lawsuit is about.</p>
@ -76,11 +76,11 @@
<h3 id="">Q: If the goal is to fight for all consumer rights, why not file this lawsuit as a class action? </h3>
<p>Forcing consumers to fight for their individual rights is one way that for-profit corporations exert their inappropriate power. Actions such as this lawsuit seek to disrupt this power dynamic by asserting that all consumers of copylefted code deserve the opportunity to know, access and modify the code on their devices. However, expecting all consumers to have to personally participate in that process not only puts an undue burden on them, it simply is not realistic. It is not how change happens. Furthermore, pursuant to “The Principles of Community Oriented GPL Enforcement,” the lawsuit does not prioritize financial remedy over compliance. This lawsuit seeks the most important remedy for the public good: release of the Complete, Corresponding Source (CCS) for all GPLd components on Vizio TVs. Once that is achieved, the benefit is immediately available to not only all who purchased a Vizio TV, but also to the entire FOSS community. </p>
<h3 id="">Q: What are “The Principles of Community Oriented GPL Enforcement”?</h3>
<p>In 2016, Software Freedom Conservancy published “The Principles of Community-Oriented GPL Enforcement” in response to those who might use copyleft licenses for their own financial gain. Software Freedom Conservancy is part of a long tradition of using copyleft enforcement as intended: to further the rights and freedoms of individual users, consumers, and developers. Pursuant to those principles, Software Freedom Conservancy never prioritizes financial gain over assuring the rights guaranteed by the GPL are upheld.</p>
<h3 id="">Q: Are the court documents released? Does that relate to why the litigation was brought in the U.S.?</h3>
<p>Software Freedom Conservancy brought this litigation within the U.S. specifically because litigation in this country is completely public. Historically, Germany has been one of the most popular venues for GPL litigation but it also has a huge downside: the German legal system keeps all details of the cases private and there is little transparency. </p>

View file

@ -49,7 +49,7 @@ By: \hspace{0.95em}\rule{0.50\textwidth}{0.2mm} \hfill{}Date: \rule{0.25\textwid
\begin{document}
\begin{center}
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} }
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} }
\par\end{center}
\bigskip{}
@ -57,11 +57,11 @@ By: \hspace{0.95em}\rule{0.50\textwidth}{0.2mm} \hfill{}Date: \rule{0.25\textwid
This Agreement is made by and between Software Freedom Conservancy
(``Conservancy'') and FIXME-CONTRIBUTOR-NAMES (the ``\signatories'')
on behalf of the project known as \projectname (the ``Project'') (each, a
``Party''; together, ``the Parties''). Conservancy is a New York nonprofit
public benefit corporation located in Brooklyn, New York, which has received
recognition of exemption from federal income tax under Section 501(c)(3) of
the Internal Revenue Code (IRC) and classification as a public charity under
on behalf of the project known as \projectname (the ``Project'') (each, a
``Party''; together, ``the Parties''). Conservancy is a New York nonprofit
public benefit corporation located in Brooklyn, New York, which has received
recognition of exemption from federal income tax under Section 501(c)(3) of
the Internal Revenue Code (IRC) and classification as a public charity under
IRC Sections 509(a)(1) and 170(b)(1)(A)(vi).
\textsc{Whereas:}
@ -69,22 +69,22 @@ IRC Sections 509(a)(1) and 170(b)(1)(A)(vi).
\begin{enumerate}[label=\Alph*.,ref=\S \Alph*]
\item Conservancy's organizational mission and charitable goal is to promote,
improve, develop and defend Free, Libre, and Open Source Software
projects.
projects.
\item The purpose of the Project is to produce, distribute, document, and
improve software and/or documentation that can be freely copied, modified and redistributed,
and for which modified versions can also be redistributed (``Free Software''),
and to facilitate and organize its production, improvement and ease
of use.
of use.
\item Conservancy desires to act as the fiscal sponsor of the Project beginning
on the Effective Date (as defined below) to assist the Project in
accomplishing its purpose, which Conservancy has determined will further
Conservancy's charitable goals. The \signatories desire to manage
the Project under the sponsorship of Conservancy.
the Project under the sponsorship of Conservancy.
\item Conservancy's Board of Directors has approved the establishment
of a fund to receive donations of cash and other property earmarked
for support of the Project and to make disbursements in furtherance
of the Project's mission (the ``Project Fund''). Currently, the
principal office of the Project is located at: [FIXME: MAILING ADDRESS].
principal office of the Project is located at: [FIXME: MAILING ADDRESS].
\end{enumerate}
\medskip{}
@ -94,7 +94,7 @@ principal office of the Project is located at: [FIXME: MAILING ADDRESS].
\begin{enumerate}[label=\arabic*.,ref=\S~\arabic*]
\item \textbf{Term of Agreement}. As of the Effective Date, the Project
joins Conservancy, which relationship will continue unless and until
terminated as set forth in \ref{Termination}.
terminated as set forth in \ref{Termination}.
\item \textbf{Project Management and Activities}.
@ -106,7 +106,7 @@ to the \leadershipbody as defined in \ref{Representation},
subject at all times to the direction and control of Conservancy's
Board of Directors. Conservancy will only intervene in the program
activities to the extent the Project is not in compliance with \ref{FreeSoftware}
or \ref{CharitablePurpose} of this Agreement.
or \ref{CharitablePurpose} of this Agreement.
\item \textbf{The Project Will Be Free Software}. \label{FreeSoftware}
Conservancy and the \leadershipbody agree that any and all software
and/or documentation distributed by the Project will be distributed solely as Free Software.
@ -119,11 +119,11 @@ revenue items, accounts payable and receivable, negotiation of leases
and contracts, disbursement of Project funds (including grants), and
other activities planned by the Project shall be the ultimate responsibility
of Conservancy and shall be conducted in the name of Conservancy,
beginning on the Effective Date.
beginning on the Effective Date.
\item \textbf{Project Not An Agent Of Conservancy}. The \signatories
hereby acknowledge that the Project and the \leadershipbody
do not and shall not act as an agent for Conservancy unless specifically
authorized in writing by Conservancy to do so.
authorized in writing by Conservancy to do so.
\end{enumerate}
\item \textbf{Fees}. The \signatories agree to donate ten percent
(10\%) of the Project's gross revenue (including, but not necessarily limited
@ -161,7 +161,7 @@ is the intent of the Parties that this Agreement be interpreted to
provide Conservancy with variance powers necessary to enable Conservancy
to treat the Project Fund as Conservancy's asset in accordance with
Financial Accounting Statement No. 136 issued by the Financial Accounting
Standards Board, while this Agreement is in effect.
Standards Board, while this Agreement is in effect.
\item \textbf{Project Fund Management / Performance of Charitable Purposes}.
\label{CharitablePurpose} All of the assets received by Conservancy
under the terms of this Agreement shall be devoted to the purposes
@ -176,7 +176,7 @@ to participate or intervene in any political campaign on behalf or
in opposition to any candidate for public office, to induce or encourage
violations of law or public policy, to cause any private inurement
or improper private benefit to occur, nor to take any other action
inconsistent with IRC Section 501(c)(3).
inconsistent with IRC Section 501(c)(3).
\item \textbf{Representation of the Project in Conservancy}. \label{Representation}The
\signatories, each a signatory hereto, hereby establish and comprise
@ -265,28 +265,28 @@ Members and/or to increase the Committee composition to the required
Minimum.
\item \textbf{An Elected Oversight Committee.} The \signatories, each
a signatory hereto, shall initially [FIXME: form or comprise] the
\leadershipbody as a Project Committee (``Committee'') to
a signatory hereto, shall initially [FIXME: form or comprise] the
\leadershipbody as a Project Committee (``Committee'') to
represent the Project in its official communication with Conservancy. The
Committee shall hereafter be elected by community members of the Project as
designated by the Committee or a subcommittee of the Committee (the
``Community Members'').
designated by the Committee or a subcommittee of the Committee (the
``Community Members'').
The positions on the Committee will be on a two-year staggered basis
([FIX-ME: some portion] of the initial board seats will be for one year).
The members of the Committee may be removed from the position at any time
by a majority vote of the Community Members. Upon the resignation or
removal of a member of the Oversight Board, the Community Members shall
elect a replacement Community Member to serve on the Committee.
The positions on the Committee will be on a two-year staggered basis
([FIX-ME: some portion] of the initial board seats will be for one year).
The members of the Committee may be removed from the position at any time
by a majority vote of the Community Members. Upon the resignation or
removal of a member of the Oversight Board, the Community Members shall
elect a replacement Community Member to serve on the Committee.
The Committee will elect a single individual to communicate with
Conservancy (the ``Representative'') and shall notify Conservancy promptly
following the election of a new Representative. The Representative will
The Committee will elect a single individual to communicate with
Conservancy (the ``Representative'') and shall notify Conservancy promptly
following the election of a new Representative. The Representative will
have the authority to instruct Conservancy on the Project's behalf on all
matters.
matters.
This section may be modified by a vote of at least $\frac{3}{4}$ths of the
Community Members, with the consent of Conservancy, such consent not to be
This section may be modified by a vote of at least $\frac{3}{4}$ths of the
Community Members, with the consent of Conservancy, such consent not to be
unreasonably withheld.
@ -299,7 +299,7 @@ project usually has a uniquely worded Representation section. ]
\item \textbf{Outstanding Liabilities}. The \signatories represent
that any liabilities that may be outstanding in connection with the
Project have been disclosed to Conservancy.
Project have been disclosed to Conservancy.
\item \textbf{Termination}. \label{Termination} The \leadershipbody or Conservancy
may terminate this Agreement at any time subject to the following
understandings:
@ -315,20 +315,20 @@ following requirements (the ``Successor has Qualified''):
\begin{enumerate}[label=\roman*.,ref=\theenumi(\alph{enumii})(\roman*)]
\item the Successor is another nonprofit corporation which is tax-exempt
under IRC Section 501(c)(3),
under IRC Section 501(c)(3),
\item the Successor is not classified as a private foundation under Section
509(a),
\item the Successor is willing and able to sponsor the Project, and,
509(a),
\item the Successor is willing and able to sponsor the Project, and,
\item the Successor has (a) communicated its willingness to sponsor the
Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and,
Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and,
\item the Successor is approved in writing by both Parties by the end of
the Notice Period, such approval not to be unreasonably withheld.
the Notice Period, such approval not to be unreasonably withheld.
\end{enumerate}
\item \textbf{Additional Search Periods}. If the Parties cannot agree on
a Successor to sponsor the Project, the \leadershipbody
shall have an additional 60 days to find a Successor willing and able
to sponsor the Project. Any subsequent search periods of any length
shall only be granted at Conservancy's written permission.
shall only be granted at Conservancy's written permission.
\item \textbf{Transfer to a Successor}. If a Successor has Qualified, the balance
of assets in the Project Fund, together with any other assets held
or liabilities incurred by Conservancy in connection with the
@ -339,8 +339,8 @@ that may be required.
\item \textbf{Termination Without a Successor}. If no Successor is found,
Conservancy may dispose of Project assets and liabilities
in any manner consistent with applicable tax and charitable trust
laws.
\item \textbf{\signatories' Right to Terminate.}
laws.
\item \textbf{\signatories' Right to Terminate.}
The \signatories hereby acknowledge that they will relinquish any
rights to terminate separate from the \leadershipbody as
of the Effective Date.
@ -352,16 +352,16 @@ This Agreement shall be interpreted and construed in accordance with
the laws of the State of New York. This Agreement constitutes the
only agreement, and supersedes all prior agreements and understandings,
both written and oral, among the Parties with respect to the subject
matter hereof.
matter hereof.
\item \textbf{Amendments. }This Agreement may not be amended or modified,
except in writing and signed by both Conservancy and the entirety of \leadershipbody.
except in writing and signed by both Conservancy and the entirety of \leadershipbody.
\item \textbf{Counterparts / Facsimile}. This Agreement may be executed
in two or more counterparts, each of which shall constitute an original,
but all of which, when together, shall constitute but one and the
same instrument, and shall become effective when one or more counterparts
have been signed by each Party hereto and delivered to the other Party.
In lieu of the original, a facsimile transmission or copy of the original
shall be as effective and enforceable as the original.
shall be as effective and enforceable as the original.
\end{enumerate}
\vfill{}

View file

@ -26,7 +26,7 @@
sponsorship, we are selective and often refer projects to other fiscal
sponsors that are a better fit. Nevertheless, we encourage projects to
that need a non-profit home to apply to many fiscal sponsors.
<p>Conservancy's Evaluation Committee considers applications on a rolling
basis. Conservancy generally has dozens of projects in various stages of
the application process. We do not move rapidly to accept new projects, as

View file

@ -46,10 +46,12 @@ def run(cmd, encoding=None, ok_exitcodes=frozenset([0]), **kwargs):
no_data = ''
with contextlib.ExitStack() as exit_stack:
proc = exit_stack.enter_context(subprocess.Popen(cmd, **kwargs))
pipes = [exit_stack.enter_context(open(
getattr(proc, name).fileno(), mode, encoding=encoding, closefd=False))
for name in ['stdout', 'stderr']
if kwargs.get(name) is subprocess.PIPE]
pipes = [
exit_stack.enter_context(open(
getattr(proc, name).fileno(), mode, encoding=encoding, closefd=False))
for name in ['stdout', 'stderr']
if kwargs.get(name) is subprocess.PIPE
]
if pipes:
yield (proc, *pipes)
else:
@ -88,6 +90,7 @@ class GitPath:
def _cache(orig_func):
attr_name = '_cached_' + orig_func.__name__
@functools.wraps(orig_func)
def cache_wrapper(self):
try:
@ -353,4 +356,3 @@ def main(arglist=None, stdout=sys.stdout, stderr=sys.stderr):
if __name__ == '__main__':
exit(main())

View file

@ -35,7 +35,7 @@
<ul>
<li>funding travel expenses for project developers to attend relevant
conferences.</li>
conferences.</li>
<li>domain name fees, bandwidth costs, and computer equipment
purchases.</li>
@ -47,7 +47,7 @@
software and its documentation.</li>
<li>sponsoring and organizing conferences for the project.</li>
<li>trademark registration and enforcement.</li>
<li>FLOSS license enforcement and compliance activity.</li>

View file

@ -16,6 +16,3 @@ class EventAdmin(admin.ModelAdmin):
@admin.register(EventMedia)
class EventMediaAdmin(admin.ModelAdmin):
list_display = ("event", "format", "novel")

View file

@ -96,4 +96,3 @@ class EventMedia(models.Model):
def __str__(self):
return "{} media: {}".format(self.event, self.format)

View file

@ -13,9 +13,11 @@ from .news.models import PressRelease
class ConservancyFeedBase(Feed):
def copyright_holder(self): return "Software Freedom Conservancy"
def copyright_holder(self):
return "Software Freedom Conservancy"
def license_no_html(self): return "Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License."
def license_no_html(self):
return "Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License."
def item_copyright(self, item):
year = 2008
@ -89,7 +91,8 @@ class OmnibusFeed(ConservancyFeedBase):
def item_description(self, item):
return item.summary
def item_enclosure_mime_type(self): return "audio/mpeg"
def item_enclosure_mime_type(self):
return "audio/mpeg"
def item_enclosure_url(self, item):
if hasattr(item, 'mp3_path'):
@ -98,9 +101,6 @@ class OmnibusFeed(ConservancyFeedBase):
if hasattr(item, 'mp3_path'):
return item.mp3_length
def item_pubdate(self, item):
return item.pub_date
def item_author_name(self, item):
if item.omnibus_type == "blog":
return item.author.formal_name
@ -174,7 +174,8 @@ class BlogFeed(ConservancyFeedBase):
firstTime = True
done = {}
for tag in tags:
if tag in done: continue
if tag in done:
continue
if firstTime:
answer += " ("
firstTime = False
@ -186,14 +187,16 @@ class BlogFeed(ConservancyFeedBase):
else:
answer += "."
return answer
def description(self, obj):
answer = "Blogs at the Software Freedom Conservancy"
GET = obj.GET
tags = []
if 'author' in GET: tags = GET.getlist('author')
if 'tag' in GET: tags += GET.getlist('tag')
if 'author' in GET:
tags = GET.getlist('author')
if 'tag' in GET:
tags += GET.getlist('tag')
done = {}
if len(tags) == 1:
@ -201,7 +204,8 @@ class BlogFeed(ConservancyFeedBase):
elif len(tags) > 1:
firstTime = True
for tag in tags:
if tag in done: continue
if tag in done:
continue
if firstTime:
answer += " tagged with "
firstTime = False
@ -214,7 +218,7 @@ class BlogFeed(ConservancyFeedBase):
answer += "."
return answer
def item_title(self, item):
return item.headline

View file

@ -19,7 +19,3 @@ class ExternalArticleAdmin(admin.ModelAdmin):
list_filter = ['date']
date_hierarchy = 'date'
search_fields = ["title", "info", "publication"]

View file

@ -34,8 +34,10 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
return self.headline
def get_absolute_url(self):
return "/news/{}/{}/".format(self.pub_date.strftime("%Y/%b/%d").lower(),
self.slug)
return "/news/{}/{}/".format(
self.pub_date.strftime("%Y/%b/%d").lower(),
self.slug,
)
def is_recent(self):
return self.pub_date > (datetime.now() - timedelta(days=5))
@ -60,11 +62,11 @@ class PressRelease(models.Model, bsoup.SoupModelMixin):
# Ping Technorati
j = xmlrpc.client.Server('http://rpc.technorati.com/rpc/ping')
reply = j.weblogUpdates.ping(blog_name, blog_url)
j.weblogUpdates.ping(blog_name, blog_url)
# Ping Google Blog Search
j = xmlrpc.client.Server('http://blogsearch.google.com/ping/RPC2')
reply = j.weblogUpdates.ping(blog_name, blog_url, post_url)
j.weblogUpdates.ping(blog_name, blog_url, post_url)
# Call any superclass's method
super().save()
@ -114,4 +116,3 @@ class ExternalArticle(models.Model):
objects = models.Manager()
public = PublicExternalArticleManager()

View file

@ -1,7 +1,6 @@
from datetime import datetime
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import ListView
from django.views.generic.dates import (
@ -11,8 +10,7 @@ from django.views.generic.dates import (
YearArchiveView,
)
from ..events.models import Event
from .models import ExternalArticle, PressRelease
from .models import PressRelease
class NewsListView(ListView):
@ -22,13 +20,14 @@ class NewsListView(ListView):
# context['key'] = 'value'
context.update(self.extra_context)
return context
def listing(request, *args, **kwargs):
news_queryset = PressRelease.objects.all()
# if (not kwargs.has_key('allow_future')) or not kwargs['allow_future']:
news_queryset = news_queryset.filter(**{'%s__lte' % kwargs['date_field']:
datetime.now()})
news_queryset = news_queryset.filter(
**{'%s__lte' % kwargs['date_field']: datetime.now()}
)
date_list = news_queryset.dates(kwargs['date_field'], 'year')
@ -93,4 +92,3 @@ class NewsDateDetailView(DateDetailView):
# # del kwargs['slug']
# callable = NewsDateDetailView.as_view(**kwargs)
# return callable(request)

View file

@ -39,5 +39,3 @@ class CastAdmin(admin.ModelAdmin):
search_fields = ['title', 'summary', 'body']
prepopulated_fields = {'slug': ("title",)}
filter_horizontal = ('tags',)

View file

@ -19,7 +19,6 @@
from datetime import datetime, timedelta
from django.db import models
from django.urls import reverse
class Podcast(models.Model):

View file

@ -1,4 +1,4 @@
from .base import *
from .base import * # NOQA
DEBUG = True
ALLOWED_HOSTS = ['*']

View file

@ -2,7 +2,7 @@ import json
from django.core.exceptions import ImproperlyConfigured
from .base import *
from .base import * # NOQA
DEBUG = False
ALLOWED_HOSTS = ['www.sfconservancy.org', 'sfconservancy.org']
@ -25,7 +25,7 @@ DATABASES = {
# Apache/mod_wsgi doesn't make it straightforward to pass environment variables
# to Django (can't use the Apache config).
with open(BASE_DIR.parent / 'secrets.json') as f:
with open(BASE_DIR.parent / 'secrets.json') as f: # NOQA
secrets = json.load(f)
def get_secret(secrets, setting):

View file

@ -8,4 +8,3 @@ class PersonAdmin(admin.ModelAdmin):
list_display = ("username", "formal_name", "casual_name",
"currently_employed")
list_filter = ["currently_employed"]

View file

@ -8,7 +8,7 @@ p, h1, h2, h3, h4, h5, h6, #mainContent ul, #mainContent ol {
margin-bottom: 1em;
}
p {
p, li {
line-height: 1.6;
}

View file

@ -186,7 +186,7 @@ template { display: none; }
[hidden] { display: none; }
/* Modules */
/*
BOX SIZING
*/
@ -785,7 +785,7 @@ code, .code { font-family: Consolas, monaco, monospace; }
/*
FORMS
*/
.input-reset { -webkit-appearance: none; -moz-appearance: none; }
.button-reset::-moz-focus-inner, .input-reset::-moz-focus-inner { border: 0; padding: 0; }
@ -1070,8 +1070,8 @@ code, .code { font-family: Consolas, monaco, monospace; }
Docs: http://tachyons.io/docs/themes/skins/
Classes for setting foreground and background colors on elements.
If you haven't declared a border color, but set border on an element, it will
be set to the current text color.
If you haven't declared a border color, but set border on an element, it will
be set to the current text color.
*/
/* Text colors */
@ -1189,13 +1189,13 @@ code, .code { font-family: Consolas, monaco, monospace; }
.bg-washed-yellow { background-color: #fffceb; }
.bg-washed-red { background-color: #ffdfdf; }
.bg-inherit { background-color: inherit; }
/*
/*
SKINS:PSEUDO
Customize the color of an element when
it is focused or hovered over.
*/
.hover-black:hover { color: #000; }
.hover-black:focus { color: #000; }
@ -1876,16 +1876,16 @@ code, .code { font-family: Consolas, monaco, monospace; }
.grow-large:active { -webkit-transform: scale( .95 ); transform: scale( .95 ); }
/* Add pointer on hover */
.pointer:hover { cursor: pointer; }
/*
/*
Add shadow on hover.
Performant box-shadow animation pattern from
http://tobiasahlin.com/blog/how-to-animate-box-shadow/
Performant box-shadow animation pattern from
http://tobiasahlin.com/blog/how-to-animate-box-shadow/
*/
.shadow-hover { cursor: pointer; position: relative; transition: all .5s cubic-bezier( .165, .84, .44, 1 ); }
.shadow-hover::after { content: ''; box-shadow: 0 0 16px 2px rgba( 0, 0, 0, .2 ); border-radius: inherit; opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: -1; transition: opacity .5s cubic-bezier( .165, .84, .44, 1 ); }
.shadow-hover:hover::after, .shadow-hover:focus::after { opacity: 1; }
/* Combine with classes in skins and skins-pseudo for
/* Combine with classes in skins and skins-pseudo for
* many different transition possibilities. */
.bg-animate, .bg-animate:hover, .bg-animate:focus { transition: background-color .15s ease-in-out; }
/*

File diff suppressed because one or more lines are too long

View file

@ -4434,4 +4434,3 @@ being here with Ken thanks so much
01:00:28.380 --> 01:00:31.380
foreign

View file

@ -118,7 +118,7 @@ then we're all dependent
on that company's goodwill.
00:02:07.400 --> 00:02:10.800
They can say of their own accord:
They can say of their own accord:
we'll solve this, not that.
00:02:10.800 --> 00:02:13.680
@ -202,4 +202,3 @@ we request
00:03:38.680 --> 00:03:44.200
that you grant Karen Sandler
the KU Leuven honorary doctorate.

View file

@ -214,4 +214,3 @@ op voordracht van de Academische Raad,
00:03:38.680 --> 00:03:44.200
het eredoctoraat van de KU Leuven
te verlenen aan mevrouw Karen Sandler.

View file

@ -49,7 +49,7 @@ By: \hspace{0.95em}\rule{0.50\textwidth}{0.2mm} \hfill{}Date: \rule{0.25\textwid
\begin{document}
\begin{center}
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} }
\textsc{\Huge Fiscal Sponsorship Agreement}{\Huge {} }
\par\end{center}
\bigskip{}
@ -57,11 +57,11 @@ By: \hspace{0.95em}\rule{0.50\textwidth}{0.2mm} \hfill{}Date: \rule{0.25\textwid
This Agreement is made by and between Software Freedom Conservancy
(``Conservancy'') and FIXME-CONTRIBUTOR-NAMES (the ``\signatories'')
on behalf of the project known as \projectname (the ``Project'') (each, a
``Party''; together, ``the Parties''). Conservancy is a New York nonprofit
public benefit corporation located in Brooklyn, New York, which has received
recognition of exemption from federal income tax under Section 501(c)(3) of
the Internal Revenue Code (IRC) and classification as a public charity under
on behalf of the project known as \projectname (the ``Project'') (each, a
``Party''; together, ``the Parties''). Conservancy is a New York nonprofit
public benefit corporation located in Brooklyn, New York, which has received
recognition of exemption from federal income tax under Section 501(c)(3) of
the Internal Revenue Code (IRC) and classification as a public charity under
IRC Sections 509(a)(1) and 170(b)(1)(A)(vi).
\textsc{Whereas:}
@ -69,22 +69,22 @@ IRC Sections 509(a)(1) and 170(b)(1)(A)(vi).
\begin{enumerate}[label=\Alph*.,ref=\S \Alph*]
\item Conservancy's organizational mission and charitable goal is to promote,
improve, develop and defend Free, Libre, and Open Source Software
projects.
projects.
\item The purpose of the Project is to produce, distribute, document, and
improve software and/or documentation that can be freely copied, modified and redistributed,
and for which modified versions can also be redistributed (``Free Software''),
and to facilitate and organize its production, improvement and ease
of use.
of use.
\item Conservancy desires to act as the fiscal sponsor of the Project beginning
on the Effective Date (as defined below) to assist the Project in
accomplishing its purpose, which Conservancy has determined will further
Conservancy's charitable goals. The \signatories desire to manage
the Project under the sponsorship of Conservancy.
the Project under the sponsorship of Conservancy.
\item Conservancy's Board of Directors has approved the establishment
of a fund to receive donations of cash and other property earmarked
for support of the Project and to make disbursements in furtherance
of the Project's mission (the ``Project Fund''). Currently, the
principal office of the Project is located at: [FIXME: MAILING ADDRESS].
principal office of the Project is located at: [FIXME: MAILING ADDRESS].
\end{enumerate}
\medskip{}
@ -94,7 +94,7 @@ principal office of the Project is located at: [FIXME: MAILING ADDRESS].
\begin{enumerate}[label=\arabic*.,ref=\S~\arabic*]
\item \textbf{Term of Agreement}. As of the Effective Date, the Project
joins Conservancy, which relationship will continue unless and until
terminated as set forth in \ref{Termination}.
terminated as set forth in \ref{Termination}.
\item \textbf{Project Management and Activities}.
@ -106,7 +106,7 @@ to the \leadershipbody as defined in \ref{Representation},
subject at all times to the direction and control of Conservancy's
Board of Directors. Conservancy will only intervene in the program
activities to the extent the Project is not in compliance with \ref{FreeSoftware}
or \ref{CharitablePurpose} of this Agreement.
or \ref{CharitablePurpose} of this Agreement.
\item \textbf{The Project Will Be Free Software}. \label{FreeSoftware}
Conservancy and the \leadershipbody agree that any and all software
and/or documentation distributed by the Project will be distributed solely as Free Software.
@ -119,11 +119,11 @@ revenue items, accounts payable and receivable, negotiation of leases
and contracts, disbursement of Project funds (including grants), and
other activities planned by the Project shall be the ultimate responsibility
of Conservancy and shall be conducted in the name of Conservancy,
beginning on the Effective Date.
beginning on the Effective Date.
\item \textbf{Project Not An Agent Of Conservancy}. The \signatories
hereby acknowledge that the Project and the \leadershipbody
do not and shall not act as an agent for Conservancy unless specifically
authorized in writing by Conservancy to do so.
authorized in writing by Conservancy to do so.
\end{enumerate}
\item \textbf{Fees}. The \signatories agree to donate ten percent
(10\%) of the Project's gross revenue (including, but not necessarily limited
@ -161,7 +161,7 @@ is the intent of the Parties that this Agreement be interpreted to
provide Conservancy with variance powers necessary to enable Conservancy
to treat the Project Fund as Conservancy's asset in accordance with
Financial Accounting Statement No. 136 issued by the Financial Accounting
Standards Board, while this Agreement is in effect.
Standards Board, while this Agreement is in effect.
\item \textbf{Project Fund Management / Performance of Charitable Purposes}.
\label{CharitablePurpose} All of the assets received by Conservancy
under the terms of this Agreement shall be devoted to the purposes
@ -176,7 +176,7 @@ to participate or intervene in any political campaign on behalf or
in opposition to any candidate for public office, to induce or encourage
violations of law or public policy, to cause any private inurement
or improper private benefit to occur, nor to take any other action
inconsistent with IRC Section 501(c)(3).
inconsistent with IRC Section 501(c)(3).
\item \textbf{Representation of the Project in Conservancy}. \label{Representation}The
\signatories, each a signatory hereto, hereby establish and comprise
@ -265,28 +265,28 @@ Members and/or to increase the Committee composition to the required
Minimum.
\item \textbf{An Elected Oversight Committee.} The \signatories, each
a signatory hereto, shall initially [FIXME: form or comprise] the
\leadershipbody as a Project Committee (``Committee'') to
a signatory hereto, shall initially [FIXME: form or comprise] the
\leadershipbody as a Project Committee (``Committee'') to
represent the Project in its official communication with Conservancy. The
Committee shall hereafter be elected by community members of the Project as
designated by the Committee or a subcommittee of the Committee (the
``Community Members'').
designated by the Committee or a subcommittee of the Committee (the
``Community Members'').
The positions on the Committee will be on a two-year staggered basis
([FIX-ME: some portion] of the initial board seats will be for one year).
The members of the Committee may be removed from the position at any time
by a majority vote of the Community Members. Upon the resignation or
removal of a member of the Oversight Board, the Community Members shall
elect a replacement Community Member to serve on the Committee.
The positions on the Committee will be on a two-year staggered basis
([FIX-ME: some portion] of the initial board seats will be for one year).
The members of the Committee may be removed from the position at any time
by a majority vote of the Community Members. Upon the resignation or
removal of a member of the Oversight Board, the Community Members shall
elect a replacement Community Member to serve on the Committee.
The Committee will elect a single individual to communicate with
Conservancy (the ``Representative'') and shall notify Conservancy promptly
following the election of a new Representative. The Representative will
The Committee will elect a single individual to communicate with
Conservancy (the ``Representative'') and shall notify Conservancy promptly
following the election of a new Representative. The Representative will
have the authority to instruct Conservancy on the Project's behalf on all
matters.
matters.
This section may be modified by a vote of at least $\frac{3}{4}$ths of the
Community Members, with the consent of Conservancy, such consent not to be
This section may be modified by a vote of at least $\frac{3}{4}$ths of the
Community Members, with the consent of Conservancy, such consent not to be
unreasonably withheld.
@ -299,7 +299,7 @@ project usually has a uniquely worded Representation section. ]
\item \textbf{Outstanding Liabilities}. The \signatories represent
that any liabilities that may be outstanding in connection with the
Project have been disclosed to Conservancy.
Project have been disclosed to Conservancy.
\item \textbf{Termination}. \label{Termination} The \leadershipbody or Conservancy
may terminate this Agreement at any time subject to the following
understandings:
@ -315,20 +315,20 @@ following requirements (the ``Successor has Qualified''):
\begin{enumerate}[label=\roman*.,ref=\theenumi(\alph{enumii})(\roman*)]
\item the Successor is another nonprofit corporation which is tax-exempt
under IRC Section 501(c)(3),
under IRC Section 501(c)(3),
\item the Successor is not classified as a private foundation under Section
509(a),
\item the Successor is willing and able to sponsor the Project, and,
509(a),
\item the Successor is willing and able to sponsor the Project, and,
\item the Successor has (a) communicated its willingness to sponsor the
Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and,
Project in writing to Conservancy and (b) sent a copy of its 501(c)(3) determination letter to Conservancy, and,
\item the Successor is approved in writing by both Parties by the end of
the Notice Period, such approval not to be unreasonably withheld.
the Notice Period, such approval not to be unreasonably withheld.
\end{enumerate}
\item \textbf{Additional Search Periods}. If the Parties cannot agree on
a Successor to sponsor the Project, the \leadershipbody
shall have an additional 60 days to find a Successor willing and able
to sponsor the Project. Any subsequent search periods of any length
shall only be granted at Conservancy's written permission.
shall only be granted at Conservancy's written permission.
\item \textbf{Transfer to a Successor}. If a Successor has Qualified, the balance
of assets in the Project Fund, together with any other assets held
or liabilities incurred by Conservancy in connection with the
@ -339,8 +339,8 @@ that may be required.
\item \textbf{Termination Without a Successor}. If no Successor is found,
Conservancy may dispose of Project assets and liabilities
in any manner consistent with applicable tax and charitable trust
laws.
\item \textbf{\signatories' Right to Terminate.}
laws.
\item \textbf{\signatories' Right to Terminate.}
The \signatories hereby acknowledge that they will relinquish any
rights to terminate separate from the \leadershipbody as
of the Effective Date.
@ -352,16 +352,16 @@ This Agreement shall be interpreted and construed in accordance with
the laws of the State of New York. This Agreement constitutes the
only agreement, and supersedes all prior agreements and understandings,
both written and oral, among the Parties with respect to the subject
matter hereof.
matter hereof.
\item \textbf{Amendments. }This Agreement may not be amended or modified,
except in writing and signed by both Conservancy and the entirety of \leadershipbody.
except in writing and signed by both Conservancy and the entirety of \leadershipbody.
\item \textbf{Counterparts / Facsimile}. This Agreement may be executed
in two or more counterparts, each of which shall constitute an original,
but all of which, when together, shall constitute but one and the
same instrument, and shall become effective when one or more counterparts
have been signed by each Party hereto and delivered to the other Party.
In lieu of the original, a facsimile transmission or copy of the original
shall be as effective and enforceable as the original.
shall be as effective and enforceable as the original.
\end{enumerate}
\vfill{}

View file

@ -1 +1 @@
google-site-verification: google536264c707362f55.html
google-site-verification: google536264c707362f55.html

View file

@ -297,4 +297,4 @@
<path style="fill:#ff6600;fill-opacity:1" d="m 103.38797,65.010543 c -0.057,2.18531 -3.865755,0.28296 -4.031245,2.78125 -4.22387,-1.88052 0.32884,2.87188 -0.0937,3.3125 l -0.0312,0 -0.3125,-0.0312 c -0.20386,-0.0728 -0.49977,-0.19904 -0.9375,-0.46875 -2.9499,2.35025 -3.02157,7.23369 -6.0625,9.9375 -1.99467,4.30504 -2.47977,8.98337 -3.9375,13.46875 -0.71796,4.30292 -1.34881,8.597857 -0.28125,12.906247 0.32053,3.50159 -0.68919,8.25865 2.5,10.71875 4.72728,3.88304 8.65575,8.79543 12.624995,13.46875 6.21914,7.65333 11.72948,15.86251 16.59375,24.4375 0.32431,-2.11756 1.10954,4.26459 2.53125,4.6875 -0.49161,-3.19231 -1.13213,-8.26328 -1.4375,-12.1875 -1.5814,-10.2909 -6.65305,-19.64903 -8.5625,-29.84375 -0.0587,-0.43037 -0.12809,-0.87203 -0.1875,-1.3125 l 0,-1.28125 -0.15625,0 c -0.62551,-5.04297 -0.8504,-10.46546 2.8125,-14.40625 3.73968,-3.772097 9.30633,-4.722447 13.8125,-7.343747 1.00194,-0.59119 2.04921,-1.07174 3.125,-1.40625 0.009,-0.003 0.0228,0.003 0.0312,0 3.11701,-0.96341 6.44862,-0.93323 9.6875,-0.40625 0.0479,0.008 0.10841,0.0233 0.15625,0.0312 0.29455,0.0493 0.61389,0.099 0.90625,0.15625 2.37136,0.21133 7.14463,1.13687 8,-0.5 -3.27225,-2.78631 -7.98526,-2.59211 -11.96875,-3.6875 -0.63059,-0.11469 -1.41182,-0.24041 -2.1875,-0.3125 l -3.90625,-0.875 -0.96875,-0.25 0,0.0312 -13.96875,-2.71875 c -0.22212,-0.20226 -0.46434,-0.40933 -0.6875,-0.5625 l 13.625,1.6875 0,-0.0625 c 0.48011,0.10699 0.95576,0.19361 1.4375,0.25 l 0,0.0312 9.625,1.78125 c 1.66103,0.61952 3.4322,1.08374 5.09375,1.1875 2.74263,0.39907 6.22526,4.49092 7.125,4.6875 -0.44096,-4.307 -4.7422,-6.23586 -8.3125,-7.5 -4.1712,-2.02803 -10.4023,-1.95417 -11.0625,-7.5625 -0.1756,-0.39076 -0.34902,-0.78118 -0.5625,-1.15625 l -1.625,-2.15625 0.0625,-0.0312 c -2.21724,-2.61691 -5.34011,-4.52196 -8.65625,-5.25 -3.2914,-1.13611 -6.98773,-2.2671 -10.46875,-2.71875 -1.18132,3.47826 -2.5031,-2.75561 -5.34375,-0.90625 -2.48996,0.29488 -2.14614,0.95256 -4,-0.625 z m 17.90625,10.15625 c 0.90187,-0.0238 1.93277,0.14208 2.96875,0.5 2.76259,0.95447 4.56151,2.96523 4.03125,4.5 -0.53026,1.53477 -3.20616,1.98572 -5.96875,1.03125 -2.76259,-0.95447 -4.5615,-2.93398 -4.03125,-4.46875 0.33141,-0.95923 1.49689,-1.52281 3,-1.5625 z" id="path3499-9-7" inkscape:connector-curvature="0"/>
<text xml:space="preserve" style="font-size:95.54121399px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold" x="184.89412" y="166.37402" id="text4477" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4479" x="184.89412" y="166.37402" style="fill:#000000;fill-opacity:1">EMU</tspan></text>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -465,4 +465,4 @@
transform="matrix(2.1910821,0,0,1.3005353,-703.58095,-489.37937)"
id="g5539-5" /><g
id="g4480-1-0"
transform="matrix(1.8842212,0,0,1.1183954,-1334.0412,-1196.6312)" /></g></g></svg>
transform="matrix(1.8842212,0,0,1.1183954,-1334.0412,-1196.6312)" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View file

@ -489,4 +489,4 @@
id="c_copy_3_2_"><g
id="g210"><polygon
points="614.3,204.9 614.3,204.9 663.1,251.1 677.4,236.7 643.2,203.6 677.4,168.9 662.8,154 613.4,204 "
id="polygon212" /></g></g></g></g></svg>
id="polygon212" /></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -34,4 +34,4 @@
<path style="fill:#008460; fill-rule:evenodd;stroke:none;" d="M41.582 0.1152 C48.924 0 54.615 1.8555 59.746 4.0615 C61.051 4.623 62.302 5.1904 63.422 5.9258 C63.719 6.1211 64.511 6.5039 64.287 7.0077 C63.18 7.3007 61.767 6.8975 60.8 6.6836 C58.458 6.2598 56.114 5.8359 53.772 5.4121 C52.295 5.2422 50.817 5.0703 49.339 4.8984 C48.654 4.8721 47.97 4.8457 47.285 4.8184 C46.527 4.6973 45.475 4.7578 44.697 4.6973 C43.509 4.6025 41.851 4.6133 40.581 4.8184 C39.797 4.8809 39.013 4.9434 38.229 5.0078 C36.123 5.3711 34.082 5.5273 32.202 6.0889 C29.688 6.8389 27.356 7.6437 25.12 8.6287 C18.163 11.6957 12.229 17.0357 7.901 22.7657 C6.998 23.9627 6.037 25.1547 5.225 26.4427 C4.987 26.8197 4.495 27.9377 4.171 28.1457 C3.275 28.7187 1.545 29.0257 0.846 28.0647 C0.574 27.6897 0 26.2407 0.306 25.5237 C0.593 25.0647 0.882 24.6037 1.171 24.1447 C2.787 21.5817 4.681 19.3907 6.523 17.0897 C7.744 15.5647 9.191 14.0177 10.713 12.7927 C11.19 12.3497 11.668 11.9097 12.146 11.4667 C13.321 10.5317 14.476 9.5567 15.713 8.6837 C19.904 5.7246 24.629 3.5 30.12 1.8174 C32.522 1.082 35.081 0.832 37.824 0.3584 C39.076 0.2773 40.329 0.1953 41.582 0.1152 " transform="translate(272.014, 93.0293)"/>
</g>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -118,4 +118,4 @@
inkscape:connector-curvature="0"
d="m 0,0 c 0,-2.396 1.941,-4.337 4.336,-4.337 2.398,0 4.339,1.941 4.339,4.337 0,2.396 -1.941,4.339 -4.339,4.339 C 1.941,4.339 0,2.396 0,0"
style="fill:#414042;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path3438" /></g></g></g></svg>
id="path3438" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View file

@ -28,4 +28,4 @@
<path fill="#000000" opacity="1.00" d=" M 105.00 39.95 C 111.94 32.23 126.21 33.62 131.49 42.58 C 134.25 46.86 134.47 52.10 134.57 57.03 C 126.25 57.04 117.93 57.02 109.61 57.04 C 109.97 59.71 109.91 62.89 112.23 64.75 C 116.01 68.24 122.69 66.86 124.81 62.14 C 127.92 62.11 131.03 62.12 134.15 62.13 C 131.04 72.38 118.02 76.98 108.77 72.22 C 103.52 69.60 100.72 63.77 100.23 58.13 C 99.64 51.82 100.61 44.83 105.00 39.95 M 109.73 50.65 C 114.70 50.66 119.66 50.68 124.63 50.64 C 124.59 46.06 120.82 41.57 115.96 42.38 C 111.79 42.72 110.31 47.15 109.73 50.65 Z" id="path40"/>
<path fill="#000000" opacity="1.00" d=" M 163.72 35.86 C 169.76 34.66 176.85 34.20 182.17 37.82 C 187.50 41.88 185.59 49.27 185.94 55.03 C 186.48 60.81 184.24 67.60 188.56 72.36 C 184.89 72.73 181.19 72.53 177.51 72.56 C 177.15 71.36 176.82 70.16 176.51 68.95 C 173.24 72.22 168.65 74.78 163.88 73.90 C 159.80 73.47 155.70 70.78 154.67 66.65 C 153.46 62.09 154.47 56.33 158.76 53.71 C 163.50 50.70 169.43 51.15 174.58 49.35 C 177.03 48.30 177.22 44.39 174.67 43.34 C 170.75 41.72 164.47 42.47 164.07 47.71 C 161.00 47.73 157.94 47.73 154.87 47.71 C 155.19 42.46 158.32 37.11 163.72 35.86 M 163.83 60.91 C 162.68 66.21 169.80 67.68 173.20 65.15 C 176.55 63.00 176.49 58.61 176.66 55.10 C 172.53 56.99 165.47 55.65 163.83 60.91 Z" id="path42"/>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -34,7 +34,7 @@
<path d="m -0.282,142.233 7.751,6.868 c 4.436,-2.285 9.825,-3.558 15.604,-3.448 6.706,-3.936 15.21,-5.969 24.287,-5.241 11.093,0.89 20.691,5.708 26.815,12.565 0.479,0.029 0.959,0.058 1.443,0.097 18.916,1.518 33.586,11.022 32.768,21.232 -0.819,10.208 -16.817,17.254 -35.733,15.737 -0.3,-0.025 -0.595,-0.057 -0.893,-0.084 -7.159,6.103 -17.662,9.539 -29.065,8.624 -10.282,-0.825 -19.277,-5.028 -25.416,-11.1 -9.716,-2.061 -17.361,-7.922 -20.222,-15.152 l -8.853,-4.542" id="path57" inkscape:connector-curvature="0" style="fill:url(#SVGID_2_)"/>
<ellipse cx="71.473" cy="179.554" rx="5.4770002" ry="3.4790001" id="ellipse59" sodipodi:cx="71.473" sodipodi:cy="179.554" sodipodi:rx="5.4770002" sodipodi:ry="3.4790001" d="m 76.95,179.554 c 0,1.9214 -2.452137,3.479 -5.477,3.479 -3.024864,0 -5.477001,-1.5576 -5.477001,-3.479 0,-1.9214 2.452137,-3.479 5.477001,-3.479 3.024863,0 5.477,1.5576 5.477,3.479 z"/>
<ellipse cx="72.315002" cy="162.595" rx="5.4759998" ry="3.4779999" id="ellipse61" sodipodi:cx="72.315002" sodipodi:cy="162.595" sodipodi:rx="5.4759998" sodipodi:ry="3.4779999" d="m 77.791002,162.595 c 0,1.92085 -2.451688,3.478 -5.476,3.478 -3.024311,0 -5.475999,-1.55715 -5.475999,-3.478 0,-1.92085 2.451688,-3.478 5.475999,-3.478 3.024312,0 5.476,1.55715 5.476,3.478 z"/>
<path d="m 149.651,122.433 c 0,0 0,-0.004 0,-0.044 -0.001,-10.437 -3.399,-20.288 -8.892,-28.572 -8.285,-12.471 -20.906,-21.79 -35.708,-28.232 -14.858,-6.424 -32.154,-9.979 -50.622,-9.989 -24.62,0.038 -47.17,6.271 -64.615,17.398 -8.716,5.595 -16.216,12.502 -21.72,20.826 -5.493,8.282 -8.889,18.136 -8.891,28.573 0,0.03 0,0.056 0,0.078 0,0.042 0,0.067 0,0.077 10e-4,10.438 3.398,20.29 8.893,28.576 6.727,10.125 16.317,18.17 27.609,24.286 3.704,6.982 11.194,12.254 20.328,14.387 6.579,6.244 15.898,10.457 26.459,11.307 1.291,0.102 2.572,0.153 3.839,0.153 10.123,-0.002 19.396,-3.224 26.231,-8.683 1.755,0.136 3.484,0.203 5.183,0.203 8.646,-0.006 16.467,-1.712 22.428,-4.772 2.977,-1.536 5.501,-3.418 7.387,-5.674 1.377,-1.645 2.401,-3.518 2.944,-5.54 2.961,-1.494 5.813,-3.108 8.538,-4.846 8.714,-5.595 16.215,-12.5 21.719,-20.825 5.49,-8.282 8.888,-18.133 8.89,-28.569 0,-0.014 0,-0.041 0,-0.08 v -0.02 l 0,-0.018 z m -5.054,0.118 c 0,9.327 -3.043,18.223 -8.051,25.778 -5.045,7.633 -11.998,14.075 -20.229,19.359 -1.812,1.156 -3.689,2.256 -5.621,3.302 -0.43,-2.181 -1.402,-4.255 -2.767,-6.137 -2.831,-3.893 -7.297,-7.121 -12.814,-9.586 -0.559,-0.248 -1.131,-0.487 -1.711,-0.719 0.252,-0.106 0.511,-0.209 0.76,-0.316 11.106,-4.794 19.31,-11.416 23.75,-18.203 2.944,-4.485 4.349,-8.972 4.355,-13.547 -0.007,-4.598 -1.411,-9.085 -4.357,-13.573 -2.971,-4.515 -7.567,-8.968 -13.646,-12.862 -12.092,-7.791 -29.822,-13.058 -49.641,-13.07 -0.06,10e-4 -0.134,0 -0.22,10e-4 h -0.05 c -14.883,0.003 -28.607,2.936 -39.656,7.729 -11.114,4.796 -19.318,11.418 -23.758,18.205 -2.944,4.484 -4.348,8.972 -4.355,13.547 0.007,4.596 1.412,9.084 4.357,13.571 1.799,2.734 4.204,5.441 7.164,8.021 l -0.066,0.074 9.045,8.017 1.54,-0.793 c 3.873,-1.998 8.625,-3.176 13.759,-3.175 0.214,0 0.424,0.001 0.632,0.006 l 0.716,0.015 0.618,-0.362 c 5.39,-3.165 12.106,-5.04 19.375,-5.039 1.132,0 2.276,0.046 3.431,0.138 10.485,0.836 19.494,5.407 25.132,11.731 l 0.696,0.78 1.043,0.06 c 0.475,0.028 0.935,0.057 1.386,0.092 8.848,0.703 16.704,3.255 22.169,6.675 2.734,1.707 4.86,3.621 6.25,5.547 1.395,1.935 2.054,3.826 2.055,5.675 0,0.204 -0.007,0.408 -0.023,0.618 -0.143,1.731 -0.851,3.373 -2.187,4.984 -1.993,2.406 -5.458,4.621 -9.959,6.17 -4.497,1.554 -9.998,2.459 -15.974,2.458 -1.6,0 -3.234,-0.064 -4.893,-0.197 -0.254,-0.021 -0.539,-0.051 -0.858,-0.082 l -1.063,-0.1 -0.812,0.693 c -5.876,5.017 -14.366,8.17 -23.788,8.167 -1.133,0 -2.28,-0.046 -3.437,-0.138 -9.716,-0.776 -18.166,-4.759 -23.838,-10.378 l -0.528,-0.521 -0.726,-0.154 C 8.752,183.108 1.835,177.628 -0.594,171.401 l -0.35,-0.883 -9.7,-4.976 -1.151,2.243 1.045,-2.318 c -6.802,-4.833 -12.565,-10.544 -16.942,-17.14 -5.008,-7.553 -8.051,-16.451 -8.05,-25.78 0,-0.036 0,-0.036 0,-0.036 v -0.119 c -0.001,-9.329 3.041,-18.229 8.051,-25.782 5.045,-7.633 11.999,-14.075 20.229,-19.358 16.487,-10.527 38.125,-16.571 61.893,-16.603 17.815,0.008 34.445,3.447 48.608,9.572 14.139,6.153 25.908,14.94 33.507,26.39 5.008,7.554 8.051,16.45 8.049,25.777 0.001,0.014 0,0.054 0.001,0.12 v 0.043 z M 8.952,145.648 c -0.555,-0.331 -1.101,-0.666 -1.629,-1.008 -5.584,-3.571 -9.674,-7.601 -12.151,-11.38 -2.51,-3.866 -3.504,-7.223 -3.531,-10.801 0.026,-3.558 1.021,-6.914 3.534,-10.786 3.667,-5.66 11.143,-11.871 21.521,-16.324 l -0.999,-2.321 1.007,2.318 C 27.04,90.854 40.137,88.03 54.353,88.032 h 0.074 c 0.068,-10e-4 0.125,-10e-4 0.196,-10e-4 18.907,-0.01 35.836,5.106 46.907,12.268 5.584,3.569 9.673,7.602 12.152,11.38 2.51,3.866 3.504,7.222 3.531,10.802 -0.027,3.556 -1.021,6.914 -3.535,10.785 -3.667,5.659 -11.143,11.87 -21.521,16.323 -2.083,0.906 -4.284,1.738 -6.579,2.497 -3.089,-0.734 -6.359,-1.257 -9.761,-1.531 -0.16,-0.013 -0.318,-0.025 -0.475,-0.035 -6.619,-6.971 -16.495,-11.716 -27.783,-12.627 -1.29,-0.104 -2.57,-0.153 -3.836,-0.153 -7.868,0.001 -15.22,1.953 -21.317,5.379 -0.008,0 -0.016,0 -0.023,0 -4.819,0 -9.387,0.9 -13.431,2.529 z" id="path73" inkscape:connector-curvature="0"/>
<path d="m -13.603,123.581 c 0,0 -7.094,-53.079 67.612,-53.079 53.5,0 58.977,19.589 67.824,48.234 0,0 -19.589,-33.912 -67.612,-33.841 -67.396,0.099 -67.824,38.686 -67.824,38.686 z" id="path75" inkscape:connector-curvature="0" style="opacity:0.3"/>
<path d="m 100.138,158.756 c 0,0 5.752,2.723 17.529,-3.739 11.42,-6.266 15.534,4.363 21.228,-7.635 0,0 4.213,6.74 -30.509,26.925 -10e-4,0.001 -5.299,-12.601 -8.248,-15.551 z" id="path77" inkscape:connector-curvature="0" style="opacity:0.2"/>
@ -98,4 +98,4 @@
<path d="m 684.513,585.544 c 0.012,0.359 -0.252,0.647 -0.672,0.647 -0.371,0 -0.636,-0.288 -0.636,-0.647 0,-0.372 0.276,-0.66 0.66,-0.66 0.396,0 0.648,0.288 0.648,0.66 z m -1.175,7.435 v -5.805 h 1.055 v 5.805 h -1.055 z" id="path332" inkscape:connector-curvature="0" style="fill:#6d6d6d"/>
<path d="m 686.001,591.9 c 0.312,0.203 0.863,0.42 1.392,0.42 0.768,0 1.127,-0.384 1.127,-0.864 0,-0.504 -0.3,-0.779 -1.079,-1.067 -1.044,-0.371 -1.535,-0.947 -1.535,-1.643 0,-0.936 0.756,-1.703 2.003,-1.703 0.588,0 1.104,0.168 1.427,0.359 l -0.264,0.768 c -0.228,-0.144 -0.647,-0.336 -1.188,-0.336 -0.623,0 -0.971,0.36 -0.971,0.792 0,0.479 0.348,0.695 1.103,0.983 1.008,0.384 1.523,0.888 1.523,1.751 0,1.02 -0.791,1.751 -2.171,1.751 -0.636,0 -1.223,-0.168 -1.631,-0.407 l 0.264,-0.804 z" id="path334" inkscape:connector-curvature="0" style="fill:#6d6d6d"/>
</g>
<path style="fill:url(#linearGradient4158);fill-opacity:1;stroke:none" d="m -39.411627,128.55903 c 3.648072,9.15888 32.9454945,17.49942 34.7403045,15.93868 0.0732,-3.93095 0.43679,-8.47093 0.43679,-8.47093 0,0 16.8971525,13.88296 22.5804825,19.05885 -5.14622,2.54814 -24.4402525,13.25297 -24.4402525,13.25297 l 0.41181,-7.58934 c 0,0 -36.2179295,-6.72378 -46.4783685,-11.38754 z" id="path3382" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/></svg>
<path style="fill:url(#linearGradient4158);fill-opacity:1;stroke:none" d="m -39.411627,128.55903 c 3.648072,9.15888 32.9454945,17.49942 34.7403045,15.93868 0.0732,-3.93095 0.43679,-8.47093 0.43679,-8.47093 0,0 16.8971525,13.88296 22.5804825,19.05885 -5.14622,2.54814 -24.4402525,13.25297 -24.4402525,13.25297 l 0.41181,-7.58934 c 0,0 -36.2179295,-6.72378 -46.4783685,-11.38754 z" id="path3382" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccccc"/></svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -297,4 +297,4 @@
<path style="fill:#ff6600;fill-opacity:1" d="m 103.38797,65.010543 c -0.057,2.18531 -3.865755,0.28296 -4.031245,2.78125 -4.22387,-1.88052 0.32884,2.87188 -0.0937,3.3125 l -0.0312,0 -0.3125,-0.0312 c -0.20386,-0.0728 -0.49977,-0.19904 -0.9375,-0.46875 -2.9499,2.35025 -3.02157,7.23369 -6.0625,9.9375 -1.99467,4.30504 -2.47977,8.98337 -3.9375,13.46875 -0.71796,4.30292 -1.34881,8.597857 -0.28125,12.906247 0.32053,3.50159 -0.68919,8.25865 2.5,10.71875 4.72728,3.88304 8.65575,8.79543 12.624995,13.46875 6.21914,7.65333 11.72948,15.86251 16.59375,24.4375 0.32431,-2.11756 1.10954,4.26459 2.53125,4.6875 -0.49161,-3.19231 -1.13213,-8.26328 -1.4375,-12.1875 -1.5814,-10.2909 -6.65305,-19.64903 -8.5625,-29.84375 -0.0587,-0.43037 -0.12809,-0.87203 -0.1875,-1.3125 l 0,-1.28125 -0.15625,0 c -0.62551,-5.04297 -0.8504,-10.46546 2.8125,-14.40625 3.73968,-3.772097 9.30633,-4.722447 13.8125,-7.343747 1.00194,-0.59119 2.04921,-1.07174 3.125,-1.40625 0.009,-0.003 0.0228,0.003 0.0312,0 3.11701,-0.96341 6.44862,-0.93323 9.6875,-0.40625 0.0479,0.008 0.10841,0.0233 0.15625,0.0312 0.29455,0.0493 0.61389,0.099 0.90625,0.15625 2.37136,0.21133 7.14463,1.13687 8,-0.5 -3.27225,-2.78631 -7.98526,-2.59211 -11.96875,-3.6875 -0.63059,-0.11469 -1.41182,-0.24041 -2.1875,-0.3125 l -3.90625,-0.875 -0.96875,-0.25 0,0.0312 -13.96875,-2.71875 c -0.22212,-0.20226 -0.46434,-0.40933 -0.6875,-0.5625 l 13.625,1.6875 0,-0.0625 c 0.48011,0.10699 0.95576,0.19361 1.4375,0.25 l 0,0.0312 9.625,1.78125 c 1.66103,0.61952 3.4322,1.08374 5.09375,1.1875 2.74263,0.39907 6.22526,4.49092 7.125,4.6875 -0.44096,-4.307 -4.7422,-6.23586 -8.3125,-7.5 -4.1712,-2.02803 -10.4023,-1.95417 -11.0625,-7.5625 -0.1756,-0.39076 -0.34902,-0.78118 -0.5625,-1.15625 l -1.625,-2.15625 0.0625,-0.0312 c -2.21724,-2.61691 -5.34011,-4.52196 -8.65625,-5.25 -3.2914,-1.13611 -6.98773,-2.2671 -10.46875,-2.71875 -1.18132,3.47826 -2.5031,-2.75561 -5.34375,-0.90625 -2.48996,0.29488 -2.14614,0.95256 -4,-0.625 z m 17.90625,10.15625 c 0.90187,-0.0238 1.93277,0.14208 2.96875,0.5 2.76259,0.95447 4.56151,2.96523 4.03125,4.5 -0.53026,1.53477 -3.20616,1.98572 -5.96875,1.03125 -2.76259,-0.95447 -4.5615,-2.93398 -4.03125,-4.46875 0.33141,-0.95923 1.49689,-1.52281 3,-1.5625 z" id="path3499-9-7" inkscape:connector-curvature="0"/>
<text xml:space="preserve" style="font-size:95.54121399px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold" x="184.89412" y="166.37402" id="text4477" sodipodi:linespacing="125%"><tspan sodipodi:role="line" id="tspan4479" x="184.89412" y="166.37402" style="fill:#000000;fill-opacity:1">EMU</tspan></text>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -14,4 +14,4 @@
<path d="M 10204.26,9013.7324 C 13100.372,8264.3585 15233.852,8806.9996 17079.939,9370.0745" id="whiskerR1" style="fill:none;stroke:#000000;stroke-width:150"/>
<path d="M 10323.04,9605.8225 C 12979.09,9406.498 14556.098,9477.3417 16605.723,11028.471" id="whiskerR2" style="fill:none;stroke:#000000;stroke-width:150"/>
<path d="M 10323.04,10553.348 C 12342.144,10299.784 13208.104,10377.136 14590.985,11621.467" id="whiskerR3" style="fill:none;stroke:#000000;stroke-width:150"/>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -29,4 +29,4 @@
<path fill="#969696" d="M404.946,44.997c0-2.808,1.646-4.55,4.26-4.55s4.26,1.743,4.26,4.55v25.07h0.192 c2.227-3.194,6.97-6.969,13.745-6.969c13.941,0,21.975,12.681,21.975,26.33s-8.033,26.331-21.975,26.331 c-6.775,0-11.324-2.421-13.745-7.068h-0.192v2.518c0,2.808-1.646,4.551-4.26,4.551s-4.26-1.743-4.26-4.551V44.997z M426.727,108.4 c10.453,0,14.131-10.26,14.131-18.972c0-8.712-3.678-18.973-14.131-18.973c-10.455,0-14.135,10.261-14.135,18.973 C412.592,98.141,416.272,108.4,426.727,108.4z"/>
<path fill="#969696" d="M481.999,63.098c7.066,0,17.135,3.775,17.135,9.099c0,1.839-1.26,3.484-3.873,3.484 c-3.678,0-5.13-5.227-13.262-5.227c-4.84,0-9.002,2.129-9.002,6.485c0,9.002,27.491,8.035,27.491,22.941 c0,10.746-9.196,15.877-18.778,15.877c-10.843,0-19.361-5.422-19.361-9.779c0-2.321,1.646-3.87,3.484-3.87 c3.775,0,6.873,6.291,16.166,6.291c6.195,0,9.971-3.484,9.971-6.97c0-10.066-27.491-9.486-27.491-23.812 C464.478,68.132,473.383,63.098,481.999,63.098z"/>
</g>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

View file

@ -57,4 +57,4 @@
id="path2300"
d="m 37.083999,35.4 -0.094,-1.969 4.312,-2.062 0,0.938 -4.218,3.093 z"
style="fill:#ffffff;fill-rule:nonzero;stroke:none"
inkscape:connector-curvature="0" /></svg>
inkscape:connector-curvature="0" /></svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -43,4 +43,4 @@
<stop offset="1" stop-color="#8DCDFC" stop-opacity="0.24" id="stop41"/>
</linearGradient>
</defs>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -1090,4 +1090,4 @@
transform="matrix(1.2941148,0,0,1.2941148,1726.8994,-500.84696)"><path
inkscape:connector-curvature="0"
id="path3274"
d="m -1008.5625,872.02908 6.4688,0 3.60933,14.74219 c 0.35936,1.31251 0.64842,3.14845 0.86718,5.50781 l 0.14063,0 c 0.0156,-0.37499 0.0859,-1.04296 0.21094,-2.0039 0.12498,-0.96093 0.22655,-1.71484 0.30468,-2.26172 0.0781,-0.54687 1.15624,-5.87499 3.23438,-15.98438 l 6.5625,0 -7.47656,27.98438 c -0.90627,3.43749 -2.10939,5.90624 -3.60938,7.40625 -1.50001,1.49999 -3.5,2.24999 -6,2.25 -1.2344,-10e-6 -2.3359,-0.13283 -3.3047,-0.39844 l 0,-5.22656 c 0.6406,0.18749 1.3594,0.28124 2.1563,0.28125 2.0937,-10e-6 3.4687,-1.37501 4.125,-4.125 l 0.4453,-1.64063 z" /></g></g></g></g></g></svg>
d="m -1008.5625,872.02908 6.4688,0 3.60933,14.74219 c 0.35936,1.31251 0.64842,3.14845 0.86718,5.50781 l 0.14063,0 c 0.0156,-0.37499 0.0859,-1.04296 0.21094,-2.0039 0.12498,-0.96093 0.22655,-1.71484 0.30468,-2.26172 0.0781,-0.54687 1.15624,-5.87499 3.23438,-15.98438 l 6.5625,0 -7.47656,27.98438 c -0.90627,3.43749 -2.10939,5.90624 -3.60938,7.40625 -1.50001,1.49999 -3.5,2.24999 -6,2.25 -1.2344,-10e-6 -2.3359,-0.13283 -3.3047,-0.39844 l 0,-5.22656 c 0.6406,0.18749 1.3594,0.28124 2.1563,0.28125 2.0937,-10e-6 3.4687,-1.37501 4.125,-4.125 l 0.4453,-1.64063 z" /></g></g></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 269 KiB

After

Width:  |  Height:  |  Size: 269 KiB

View file

@ -1224,4 +1224,4 @@
style="fill:#afe478;fill-opacity:1;stroke:none"
d="M 0 0 L 0 180 L 315 180 L 315 0 L 0 0 z M 3.46875 3.625 L 311.53125 3.625 L 311.53125 176.375 L 3.46875 176.375 L 3.46875 3.625 z "
transform="matrix(1.8842212,0,0,1.1183954,-17.575647,112.68656)"
id="rect7534" /></g></g></g></svg>
id="rect7534" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 272 KiB

View file

@ -1,4 +1,4 @@
/* Copyright (C) 2012-2013 Denver Gingerich,
/* Copyright (C) 2012-2013 Denver Gingerich,
** Copyright (C) 2013-2014, 2020 Bradley M. Kuhn,
** Copyright (C) 2016, 2020 Brett Smith.
** License: GPLv3-or-later

View file

@ -6,4 +6,3 @@ from .models import Supporter
@admin.register(Supporter)
class SupporterAdmin(admin.ModelAdmin):
list_display = ('display_name', 'display_until_date')

View file

@ -52,7 +52,7 @@ strategies that defend FOSS (such as copyleft). <a href="/about" class="orange">
<section class="mh0 pa3 bg-light-blue ba b--gray">
<video style="height: auto;" controls="" poster="/videos/sfc-introduction-video_poster.jpg">
<source src="/videos/sfc-introduction_1080p.mp4" />
<track src="/docs/sfc-introduction-vtt-captions.txt" kind="subtitles" srclang="en" label="English" />
<track src="{% static 'docs/sfc-introduction-vtt-captions.txt' %}" kind="subtitles" srclang="en" label="English" />
<a href="/videos/sfc-introduction_1080p.mp4"><img src="/videos/sfc-introduction-video_poster.jpg" alt="Software Freedom Conservancy introduction video"></a><br/>
<a href="https://youtu.be/yCCxMfW0LTM">(watch on Youtube)</a>
</video>

View file

@ -1,7 +1,7 @@
from django.contrib import admin
from .emails import make_candidate_email
from .models import Candidate, Comment
from .models import Candidate, Comment, SourceOffer
class CommentInline(admin.TabularInline):
@ -36,3 +36,10 @@ class CandidateAdmin(admin.ModelAdmin):
# Announce the new candidate
email = make_candidate_email(obj, request.user)
email.send()
@admin.register(SourceOffer)
class SourceOfferAdmin(admin.ModelAdmin):
list_display = ['time', 'vendor', 'device']
fields = ['time', 'vendor', 'device', 'photo']
readonly_fields = ['time']

View file

@ -1,6 +1,6 @@
from django import forms
from .models import Comment
from .models import Comment, SourceOffer
class CommentForm(forms.ModelForm):
@ -17,3 +17,14 @@ class CommentForm(forms.ModelForm):
class DownloadForm(forms.Form):
agree = forms.BooleanField(label="I understand that the goal of this process is to determine compliance with FOSS licenses, and that in downloading the source code candidate and/or firmware image, I am assisting SFC as a volunteer to investigate that question. I, therefore, promise and represent that I will not copy, distribute, modify, or otherwise use this source code candidate and/or firmware image for any purpose other than to help SFC evaluate the source code candidate for compliance with the terms of FOSS licenses, including but not limited to any version of the GNU General Public License. Naturally, if I determine in good faith that portions of the source code candidate and/or firmware image are subject to a FOSS license and are compliant with it, I may copy, distribute, modify, or otherwise use those portions in accordance with the FOSS license, and I take full responsibility for that determination and subsequent use.")
class SourceOfferForm(forms.ModelForm):
class Meta:
model = SourceOffer
fields = ['vendor', 'device', 'photo']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['photo'].widget.attrs['capture'] = 'camera'
self.fields['photo'].widget.attrs['accept'] = 'image/*'

View file

@ -0,0 +1,30 @@
# Generated by Django 4.2.11 on 2024-07-22 08:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('usethesource', '0008_comment_attribute_to'),
]
operations = [
migrations.CreateModel(
name='SourceOffer',
fields=[
(
'id',
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name='ID',
),
),
('vendor', models.CharField(max_length=50, verbose_name='Vendor name')),
('device', models.CharField(max_length=50, verbose_name='Device name')),
('photo', models.ImageField(upload_to='usethesource/offers')),
],
),
]

View file

@ -0,0 +1,18 @@
# Generated by Django 4.2.11 on 2024-07-29 09:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('usethesource', '0009_sourceoffer'),
]
operations = [
migrations.AddField(
model_name='sourceoffer',
name='time',
field=models.DateTimeField(auto_now_add=True, null=True),
),
]

View file

@ -67,3 +67,13 @@ class Comment(models.Model):
class Meta:
ordering = ['id']
class SourceOffer(models.Model):
time = models.DateTimeField(auto_now_add=True, null=True)
vendor = models.CharField('Vendor name', max_length=50)
device = models.CharField('Device name', max_length=50)
photo = models.ImageField(upload_to='usethesource/offers')
def __str__(self):
return f'{self.vendor} {self.device}'

View file

@ -24,7 +24,7 @@
<p>One crucial way to get involved is to let us know about any source candidates you find! Many devices have an offer for source code (check the manual or device's user interface to find it) and we'd be very interested to know what they send you when you request it. Here are the steps to submit a new source candidate to list on this page:</p>
<ol class="pl4">
<li class="mb2">find a source candidate offered by a company - normally this is offered to you in the manual or user interface of your device, through a link or email address (the company's GitHub page is not canonical, unless they explicitly say so in this offer)</li>
<li class="mb2">find a source candidate offered by a company - normally this is offered to you in the manual or user interface of your device, through a link or email address (the company's GitHub page is not canonical, unless they explicitly say so in this offer). If you're curious what an offer is, check out the PDFs referenced in <a href="https://sfconservancy.org/blog/2022/dec/21/energyguide-software-repair-label/">our submission to the FTC</a>, and <a href="{% url 'usethesource:upload_offer' %}">submit a picture/image of a new offer</a> so we can test it for you if you like</li>
<li class="mb2"><a href="https://usl-upload.sfconservancy.org/s/4Ykmx7rSGMJ7s43">upload the source candidate</a> to us - write down the file name(s) you uploaded for the next step (can be multiple), and upload a firmware image if you have it and are ok with us publishing it</li>

View file

@ -0,0 +1,49 @@
{% extends "usethesource/base.html" %}
{% block title %}Upload an offer for source - Software Freedom Conservancy{% endblock %}
{% block head %}
{{ block.super }}
<script src="https://unpkg.com/htmx.org@1.9.6"></script>
{% endblock %}
{% block content %}
{{ block.super }}
<section class="mt4 mb3">
<h2 class="f2 lh-title ttu mt0">Upload an offer for source</h2>
</section>
<form id="form" hx-encoding="multipart/form-data" hx-post="{% url 'usethesource:upload_offer' %}">
{% csrf_token %}
{{ form.non_field_errors }}
<div class="mv2">
{{ form.vendor.errors }}
<label for="{{ form.vendor.id_for_label }}" class="db mb1">Vendor:</label>
{{ form.vendor }}
</div>
<div class="mv2">
{{ form.device.errors }}
<label for="{{ form.device.id_for_label }}" class="db mb1">Device:</label>
{{ form.device }}
</div>
<div class="mv2">
{{ form.photo.errors }}
<label for="{{ form.photo.id_for_label }}" class="db mb1">Photo:</label>
{{ form.photo }}
</div>
<progress id="progress" class="htmx-indicator" value="0" max="100"></progress>
<div class="mv1">
<button type="submit" class="white bg-green b db pv2 ph3 bn mb2">Send</button>
</div>
</form>
<script>
form = document.querySelector('#form');
let progress = document.querySelector('#progress');
form.addEventListener('htmx:xhr:progress', function(evt) {
console.log('progress', evt.detail.loaded/evt.detail.total * 100);
progress.value = evt.detail.loaded/evt.detail.total * 100;
});
</script>
{% endblock content %}

View file

@ -0,0 +1 @@
<p>Thanks! We've received your offer for source.</p>

View file

@ -13,4 +13,5 @@ urlpatterns = [
path('delete-comment/<int:comment_id>/<show_add>/', views.delete_comment, name='delete_comment'),
path('add-button/<slug:slug>/', views.add_button, name='add_button'),
path('ccirt-process/', views.ccirt_process, name='ccirt_process'),
path('offer/', views.upload_offer, name='upload_offer'),
]

View file

@ -3,7 +3,7 @@ from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404, redirect, render
from .models import Candidate, Comment
from .forms import CommentForm, DownloadForm
from .forms import CommentForm, DownloadForm, SourceOfferForm
from .emails import make_comment_email
@ -91,3 +91,21 @@ def add_button(request, slug):
def ccirt_process(request):
return render(request, 'usethesource/ccirt_process.html', {})
def handle_uploaded_file(f):
with open("some/file/name.txt", "wb+") as destination:
for chunk in f.chunks():
destination.write(chunk)
def upload_offer(request):
if request.method == 'POST':
form = SourceOfferForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return render(request, 'usethesource/upload_success_partial.html')
else:
return render(request, 'usethesource/upload_offer.html', {'form': form})
else:
form = SourceOfferForm()
return render(request, 'usethesource/upload_offer.html', {'form': form})

View file

@ -6,4 +6,3 @@ from .models import EarthLocation
@admin.register(EarthLocation)
class EarthLocationAdmin(admin.ModelAdmin):
list_display = ("label", "html_map_link")

View file

@ -26,4 +26,3 @@ class EarthLocation(models.Model):
def html_map_link(self): # for Admin, fixme: fix_ampersands
return '<a href="%s">map link</a>' % self.default_map_link()
html_map_link.allow_tags = True

View file

@ -97,7 +97,7 @@
# content: |-
# # After updating, run `sudo postmap hash:/etc/postfix/sasl_passwd`.
# [mail.sfconservancy.org]:587 conference@sfconservancy.org:PASSWORD
- name: Configure Postfix for relaying
copy:
src: postfix/main.cf

View file

@ -49,4 +49,4 @@ inet_protocols = all
# Relay authentication
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_security_options = noanonymous

18
pyproject.toml Normal file
View file

@ -0,0 +1,18 @@
[tool.black]
skip-string-normalization = true
line-length = 90
[tool.isort]
profile = "black"
force_sort_within_sections = true
line_length = 90
sections = "FUTURE,STDLIB,THIRDPARTY,LOCALFOLDER,FIRSTPARTY"
no_lines_before = "FIRSTPARTY"
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = 'conservancy.settings.dev'
python_files = ['test*.py']
# pytest-django will default to running tests with DEBUG = False, regardless of
# the settings you provide it. This fails due to the
# `ManifestStaticFilesStorage` without explicitly running `collectstatic` first.
django_debug_mode = true

View file

@ -4,4 +4,4 @@ Django==4.2.11
beautifulsoup4==4.11.2
html5lib==1.1
django-countries==7.3.2
Pillow==9.4.0
Pillow==9.4.0